链表分为单链表,双向链表和循环链表,是一种链式存储结构,由一个个结点链式构成,结点包含数据域和指针域,其中单链表是只有一个指向后驱结点的指针,双向链表除头结点和尾结点外,每个结点都有一个前驱指针和一个后继指针,循环链表的尾结点的指针指向头结点。
相比数组而言,链表的插入和删除比较快,查询慢。
本文主要以单链表为例,介绍下链表的常用算法操作。
单链表的结构:
在爪哇语言中,链表的每个结点用节点类来表示:
包com.linkedlist; 公共类节点{ 私人int数据;//结点数据 私人节点下;//下一个结点 公共节点(int数据){ 这一点。数据=https://www.yisu.com/zixun/data; } 公共int getData () { 返回数据; } 公共空间setData (int数据){ 这一点。data=数据; } 公共节点getNext () { 返回下一个; } 公共空间setNext(节点下){ 这一点。下一个=下一个; } }
定义一个链表操作类,里面包含常用的操作:
包com.linkedlist; 进口java.util.Hashtable; 公开课LinkedListOperator { 私人节点头=零;//头结点//在链表的末尾增加一个结点 私人空间addNode (int数据){ 节点newNode=新节点(数据); 如果(头==null) { 头=newNode; 返回; } 节点temp=头; 而(temp.getNext () !=null) { temp=temp.getNext (); } temp.setNext (newNode); }//打印链表结点 私人空间printLink () { 节点curNode=头; 而(curNode !=null) { System.out.println (curNode.getData ()); curNode=curNode.getNext (); } System.out.println (“==========="); }//求链表长度 私人int getLength () { int len=0; 节点curNode=头; 而(curNode !=null) { len + +; curNode=curNode.getNext (); } 返回兰; }//删除某一个结点 私人布尔delNode (int指数){ 如果(指数& lt;1){ 返回错误; } 如果(指数==1){ 头=head.getNext (); 返回true; } 节点preNode=头; 节点curNode=head.getNext (); int n=1; 而(curNode.getNext () !=null) { 如果(n==指数){ preNode.setData (curNode.getData ()); preNode.setNext (curNode.getNext ()); 返回true; } preNode=preNode.getNext (); curNode=curNode.getNext (); n + +; } 如果(curNode.getNext ()==null) { preNode.setNext(空); } 返回错误; }//链表排序:选择排序法,从小到大 私人空间sortList () { 节点curNode=头; 而(curNode !=null) { 节点nextNode=curNode.getNext (); 而(nextNode !=null) { 如果(curNode.getData()在nextNode.getData ()) { int temp=curNode.getData (); curNode.setData (nextNode.getData ()); nextNode.setData(临时); } nextNode=nextNode.getNext (); } curNode=curNode.getNext (); } }//去掉重复元素 私人空间distinctLink () { Integer> Hashtable<整数;地图=new Hashtable<整数,Integer> (); 节点curNode=头; 节点preNode=零; 而(curNode !=null) { 如果(map.containsKey (curNode.getData ())) { preNode.setData (curNode.getData ()); preNode.setNext (curNode.getNext ()); 其他}{ map.put (curNode.getData (), 1); preNode=curNode; } curNode=curNode.getNext (); } }//返回倒数第k个结点,定义两个指针,第一个指针向前移动k - 1次,之后两个指针同时前进,//当第一个指针到达末尾时,第二个指针所在的位置即为倒数第k个结点 私人节点getReverNode (int k) { 如果(k & lt;1){ 返回null; } 节点首先=头; 节点的第二个=头; for (int i=0;我& lt;k - 1;我+ +){ 第一次=first.getNext (); } 而(first.getNext () !=null) { 第一次=first.getNext (); 第二个=second.getNext (); } 返回第二; }//反转链表 私人空间reserveLink () { 节点preNode=零; 节点curNode=头; 节点tempNode=零; 而(curNode !=null) { tempNode=curNode.getNext (); curNode.setNext (preNode); preNode=curNode; curNode=tempNode; } 头=preNode; }//寻找链表的中间结点 私人节点getMiddleNode () { 节点slowNode=头; 节点quickNode=头; 而(slowNode.getNext() !=零,,quickNode.getNext () !=null) { slowNode=slowNode.getNext (); .getNext quickNode=quickNode.getNext () (); } 返回slowNode; }//判断链表是否有环 私人布尔isRinged () { 如果(头==null) { 返回错误; } 节点slowNode=头; 节点quickNode=头; 而(slowNode.getNext() !=零,,quickNode.getNext () !=null) { slowNode=slowNode.getNext (); .getNext quickNode=quickNode.getNext () (); 如果(slowNode.getData ()==quickNode.getData ()) { 返回true; } } 返回错误; }//删除指定结点 私人布尔delNode(节点){ 如果(node.getNext ()==null) { 返回false;//在不知道头结点的情况下,没法删除单链表的尾结点 } .getData node.setData (node.getNext () ()); .getNext node.setNext (node.getNext () ()); 返回true; }//判断两个链表是否相交:相交的链表的尾结点相同 私人布尔isCross(节点节点n1、n2) { 而(n1.getNext () !=null) { n1=n1.getNext (); } 而(n2.getNext () !=null) { n2=n2.getNext (); } 如果(n1.getData ()==n2.getData ()) { 返回true; } 返回错误; }//求相交链表的起始点 私人节点getFirstCrossNode (LinkedListOperator l1、l2 LinkedListOperator) { int len=l1.getLength ()——l2.getLength (); 节点n1=l1.head; 节点n2=l2.head; 如果(len比;0){ for (int i=0;我& lt;兰;我+ +){ n1=n1.getNext (); } 其他}{ for (int i=0;我& lt;兰;我+ +){ n2=n2.getNext (); } } 而(n1.getData () !=n2.getData ()) { n1=n1.getNext (); n2=n2.getNext (); } 返回n1; } 公共静态void main (String [] args) { LinkedListOperator llo=new LinkedListOperator (); llo.addNode (10); llo.addNode (4); llo.addNode (6); llo.addNode (8); llo.printLink ();//llo.delNode (4);//llo.sortList ();//llo.distinctLink ();//System.out.println (llo.getReverNode (3) .getData ());//llo.reserveLink ();//System.out.println (llo.getMiddleNode () .getData ());//System.out.println (llo.isRinged ()); null null null null null nullJava实现链表的常见操作算法详解