Java实现链表的常见操作算法详解

  

链表分为单链表,双向链表和循环链表,是一种链式存储结构,由一个个结点链式构成,结点包含数据域和指针域,其中单链表是只有一个指向后驱结点的指针,双向链表除头结点和尾结点外,每个结点都有一个前驱指针和一个后继指针,循环链表的尾结点的指针指向头结点。

  

相比数组而言,链表的插入和删除比较快,查询慢。

  

本文主要以单链表为例,介绍下链表的常用算法操作。

  

单链表的结构:

  

癑ava实现链表的常见操作算法详解"

  

在爪哇语言中,链表的每个结点用节点类来表示:
  

        包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   null

Java实现链表的常见操作算法详解