用java简单的实现单链表的基本操作

此代码仅供参考,如有疑问欢迎评论:

[java]  view plain  copy
  1. package com.tyxh.link;  
  2. //节点类  
  3. public class Node {  
  4.      protected Node next; //指针域  
  5.      protected int data;//数据域  
  6.        
  7.      public Node( int data) {  
  8.            this. data = data;  
  9.      }  
  10.        
  11.      //显示此节点  
  12.      public void display() {  
  13.           System. out.print( data + " ");  
  14.      }  
  15. }  
  16.   
  17. package com.tyxh.link;  
  18. //单链表  
  19. public class LinkList {  
  20.      public Node first; // 定义一个头结点  
  21.      private int pos = 0;// 节点的位置  
  22.   
  23.      public LinkList() {  
  24.            this. first = null;  
  25.      }  
  26.   
  27.      // 插入一个头节点  
  28.      public void addFirstNode( int data) {  
  29.           Node node = new Node(data);  
  30.           node. next = first;  
  31.            first = node;  
  32.      }  
  33.   
  34.      // 删除一个头结点,并返回头结点  
  35.      public Node deleteFirstNode() {  
  36.           Node tempNode = first;  
  37.            first = tempNode. next;  
  38.            return tempNode;  
  39.      }  
  40.   
  41.      // 在任意位置插入节点 在index的后面插入  
  42.      public void add(int index, int data) {  
  43.           Node node = new Node(data);  
  44.           Node current = first;  
  45.           Node previous = first;  
  46.            while ( pos != index) {  
  47.               previous = current;  
  48.               current = current. next;  
  49.                pos++;  
  50.           }  
  51.           node. next = current;  
  52.           previous. next = node;  
  53.            pos = 0;  
  54.      }  
  55.   
  56.      // 删除任意位置的节点  
  57.      public Node deleteByPos( int index) {  
  58.           Node current = first;  
  59.           Node previous = first;  
  60.            while ( pos != index) {  
  61.                pos++;  
  62.               previous = current;  
  63.               current = current. next;  
  64.           }  
  65.            if(current == first) {  
  66.                first = first. next;  
  67.           } else {  
  68.                pos = 0;  
  69.               previous. next = current. next;  
  70.           }  
  71.            return current;  
  72.      }  
  73.   
  74.      // 根据节点的data删除节点(仅仅删除第一个)  
  75.      public Node deleteByData( int data) {  
  76.           Node current = first;  
  77.           Node previous = first; //记住上一个节点  
  78.            while (current. data != data) {  
  79.                if (current. next == null) {  
  80.                     return null;  
  81.               }  
  82.               previous = current;  
  83.               current = current. next;  
  84.           }  
  85.            if(current == first) {  
  86.                first = first. next;  
  87.           } else {  
  88.               previous. next = current. next;  
  89.           }  
  90.            return current;  
  91.      }  
  92.   
  93.      // 显示出所有的节点信息  
  94.      public void displayAllNodes() {  
  95.           Node current = first;  
  96.            while (current != null) {  
  97.               current.display();  
  98.               current = current. next;  
  99.           }  
  100.           System. out.println();  
  101.      }  
  102.   
  103.      // 根据位置查找节点信息  
  104.      public Node findByPos( int index) {  
  105.           Node current = first;  
  106.            if ( pos != index) {  
  107.               current = current. next;  
  108.                pos++;  
  109.           }  
  110.            return current;  
  111.      }  
  112.   
  113.      // 根据数据查找节点信息  
  114.      public Node findByData( int data) {  
  115.           Node current = first;  
  116.            while (current. data != data) {  
  117.                if (current. next == null)  
  118.                     return null;  
  119.               current = current. next;  
  120.           }  
  121.            return current;  
  122.      }  
  123. }  
  124.   
  125. package com.tyxh.link;  
  126. //测试类  
  127. public class TestLinkList {  
  128.      public static void main(String[] args) {  
  129.           LinkList linkList = new LinkList();  
  130.           linkList.addFirstNode(20);  
  131.           linkList.addFirstNode(21);  
  132.           linkList.addFirstNode(19);  
  133.            //19,21,20  
  134.           linkList.add(122); //19,22,21,20  
  135.           linkList.add(223); //19,22,23,21,20  
  136.           linkList.add(399); //19,22,23,99,21,20  
  137.           linkList.displayAllNodes();  
  138. //        Node node = linkList.deleteFirstNode();  
  139. //        System.out.println("node : " + node.data);  
  140. //        linkList.displayAllNodes();  
  141. //        node = linkList.deleteByPos(2);  
  142. //        System.out.println("node : " + node.data);  
  143. //        linkList.displayAllNodes();  
  144. //        linkList.deleteFirstNode();  
  145.           Node node = linkList.deleteByData(19);  
  146. //        Node node = linkList.deleteByPos(0);  
  147.           System. out.println( "node : " + node. data);  
  148.           linkList.displayAllNodes();  
  149.           Node node1 = linkList.findByPos(0);  
  150.           System. out.println( "node1: " + node1. data);  
  151.           Node node2 = linkList.findByData(22);  
  152.           System. out.println( "node2: " + node2. data);  
  153.      }  
  154. }  
[java]  view plain  copy
 
  1. import java.util.HashMap;  
  2. import java.util.Scanner;  
  3. import java.util.Stack;  
  4.   
  5. /** 
  6.  *  
  7.  * @author kerryfish 
  8.  * 关于java中链表的操作 
  9.  * 1. 求单链表中结点的个数: getListLength  
  10.  * 2. 将单链表反转: reverseList(遍历),reverseListRec(递归)  
  11.  * 3. 查找单链表中的倒数第K个结点(k > 0): reGetKthNode  
  12.  * 4. 查找单链表的中间结点: getMiddleNode  
  13.  * 5. 从尾到头打印单链表: reversePrintListStack,reversePrintListRec(递归)  
  14.  * 6. 已知两个单链表pHead1 和pHead2 各自有序,把它们合并成一个链表依然有序: mergeSortedList, mergeSortedListRec  
  15.  * 7. 对单链表进行排序,listSort(归并),insertionSortList(插入) 
  16.  * 8. 判断一个单链表中是否有环: hasCycle  
  17.  * 9. 判断两个单链表是否相交: isIntersect  
  18.  * 10. 已知一个单链表中存在环,求进入环中的第一个节点: getFirstNodeInCycle, getFirstNodeInCycleHashMap  
  19.  * 11. 给出一单链表头指针head和一节点指针delete,O(1)时间复杂度删除节点delete: deleteNode 
  20.  */  
  21. public class LinkedListSummary {  
  22.     /** 
  23.      * @param args 
  24.      *  
  25.      */  
  26.     public static class Node{  
  27.         int value;  
  28.         Node next;  
  29.         public Node(int n){  
  30.             this.value=n;  
  31.             this.next=null;  
  32.         }  
  33.     }  
  34.     public static void main(String[] args) {  
  35.         // TODO Auto-generated method stub  
  36.         Scanner in=new Scanner(System.in);  
  37.         Node head=null;  
  38.         if(in.hasNextInt()){  
  39.             head=new Node(in.nextInt());  
  40.         }  
  41.         Node temp=head;  
  42.         while(in.hasNextInt()){  
  43.             temp.next=new Node(in.nextInt());  
  44.             temp=temp.next;  
  45.         }  
  46.         in.close();  
  47.         //int len=getListLength(head);  
  48.         //Node reHead=reverseList(head);  
  49.         //reHead=reverseListRec(reHead);  
  50.         //Node node_k=reGetKthNode(head,3);  
  51.         //Node mid=getMiddleNode(head);  
  52.         //reversePrintListRec(head);  
  53.         //reversePrintListStack(head);  
  54.         //Node mergeHead=mergeSortedList(head,null);  
  55.         //Node sortHead=listSort(head);  
  56.           
  57.     }  
  58.     //求单链表中结点的个数: getListLength   
  59.     public static int getListLength(Node head){  
  60.         int len=0;  
  61.         while(head!=null){  
  62.             len++;  
  63.             head=head.next;  
  64.         }  
  65.         return len;  
  66.     }  
  67.     //将单链表反转,循环  
  68.     public static Node reverseList(Node head){  
  69.         if(head==null||head.next==null)return head;  
  70.         Node pre=null;  
  71.         Node nex=null;  
  72.         while(head!=null){  
  73.             nex=head.next;  
  74.             head.next=pre;  
  75.             pre=head;  
  76.             head=nex;  
  77.         }  
  78.         return pre;  
  79.     }  
  80.     //将单链表反转,递归  
  81.     public static Node reverseListRec(Node head){  
  82.         if(head==null||head.next==null)return head;  
  83.         Node reHead=reverseListRec(head.next);  
  84.         head.next.next=head;  
  85.         head.next=null;  
  86.         return reHead;  
  87.     }  
  88.     //查找单链表中的倒数第K个结点(k > 0)  
  89.     public static Node reGetKthNode(Node head,int k){  
  90.         if(head==null)return head;  
  91.         int len=getListLength(head);  
  92.         if(k>len)return null;  
  93.         Node target=head;  
  94.         Node nexk=head;  
  95.         for(int i=0;i
  96.             nexk=nexk.next;  
  97.         }  
  98.         while(nexk!=null){  
  99.             target=target.next;  
  100.             nexk=nexk.next;  
  101.         }  
  102.         return target;  
  103.     }  
  104.     //查找单链表的中间结点   
  105.     public static Node getMiddleNode(Node head){  
  106.         if(head==null||head.next==null)return head;  
  107.         Node target=head;  
  108.         Node temp=head;  
  109.         while(temp!=null&&temp.next!=null){  
  110.             target=target.next;  
  111.             temp=temp.next.next;  
  112.         }  
  113.         return target;  
  114.     }  
  115.     //从尾到头打印单链表,递归  
  116.     public static void reversePrintListRec(Node head){  
  117.         if(head==null)return;  
  118.         else{  
  119.             reversePrintListRec(head.next);  
  120.             System.out.println(head.value);  
  121.         }  
  122.     }  
  123.     //从尾到头打印单链表,栈  
  124.     public static void reversePrintListStack(Node head){  
  125.         Stack s=new Stack();  
  126.         while(head!=null){  
  127.             s.push(head);  
  128.             head=head.next;  
  129.         }  
  130.         while(!s.isEmpty()){  
  131.             System.out.println(s.pop().value);  
  132.         }  
  133.     }  
  134.     //合并两个有序的单链表head1和head2,循环  
  135.     public static Node mergeSortedList(Node head1,Node head2){  
  136.         if(head1==null)return head2;  
  137.         if(head2==null)return head1;  
  138.         Node target=null;  
  139.         if(head1.value>head2.value){  
  140.             target=head2;  
  141.             head2=head2.next;  
  142.         }  
  143.         else{  
  144.             target=head1;  
  145.             head1=head1.next;  
  146.         }  
  147.         target.next=null;  
  148.         Node mergeHead=target;  
  149.         while(head1!=null && head2!=null){  
  150.             if(head1.value>head2.value){  
  151.                 target.next=head2;  
  152.                 head2=head2.next;  
  153.             }  
  154.             else{  
  155.                 target.next=head1;  
  156.                 head1=head1.next;  
  157.             }  
  158.             target=target.next;  
  159.             target.next=null;  
  160.         }  
  161.         if(head1==null)target.next=head2;  
  162.         else target.next=head1;  
  163.         return mergeHead;  
  164.     }  
  165.     //合并两个有序的单链表head1和head2,递归  
  166.     public static Node mergeSortedListRec(Node head1,Node head2){  
  167.         if(head1==null)return head2;  
  168.         if(head2==null)return head1;  
  169.         if(head1.value>head2.value){  
  170.             head2.next=mergeSortedListRec(head2.next,head1);  
  171.             return head2;  
  172.         }  
  173.         else{  
  174.             head1.next=mergeSortedListRec(head1.next,head2);  
  175.             return head1;  
  176.         }  
  177.     }  
  178.     //对单链表进行排序,归并排序,在排序里面不建议选用递归的合并有序链表算法,如果链表长度较长,很容易出现栈溢出  
  179.     public static Node listSort(Node head){  
  180.         Node nex=null;  
  181.         if(head==null||head.next==null)return head;  
  182.         else if(head.next.next==null){  
  183.             nex=head.next;  
  184.             head.next=null;  
  185.         }  
  186.         else{  
  187.             Node mid=getMiddleNode(head);  
  188.             nex=mid.next;  
  189.             mid.next=null;  
  190.         }  
  191.         return mergeSortedList(listSort(head),listSort(nex));//合并两个有序链表,不建议递归  
  192.     }  
  193.     //对单链表进行排序,插入排序  
  194.     public Node insertionSortList(Node head) {  
  195.         if(head==null||head.next==null)return head;  
  196.         Node pnex=head.next;  
  197.         Node pnex_nex=null;  
  198.         head.next=null;  
  199.         while(pnex!=null){  
  200.             pnex_nex=pnex.next;  
  201.             Node temp=head;  
  202.             Node temp_pre=null;  
  203.             while(temp!=null){  
  204.                 if(temp.value>pnex.value)break;  
  205.                 temp_pre=temp;  
  206.                 temp=temp.next;  
  207.             }  
  208.             if(temp_pre==null){  
  209.                 head=pnex;  
  210.                 pnex.next=temp;  
  211.             }  
  212.             else{  
  213.                 temp_pre.next=pnex;  
  214.                 pnex.next=temp;  
  215.             }  
  216.             pnex=pnex_nex;  
  217.         }  
  218.         return head;  
  219.     }  
  220.     //判断一个单链表中是否有环,快慢指针  
  221.     public static boolean hasCycle(Node head){  
  222.         boolean flag=false;  
  223.         Node p1=head;  
  224.         Node p2=head;  
  225.         while(p1!=null&&p2!=null){  
  226.             p1=p1.next;  
  227.             p2=p2.next.next;  
  228.             if(p2==p1){  
  229.                 flag=true;  
  230.                 break;  
  231.             }  
  232.         }  
  233.         return flag;  
  234.     }  
  235.     //判断两个单链表是否相交,如果相交返回第一个节点,否则返回null  
  236.     //如果单纯的判断是否相交,只需要看最后一个指针是否相等  
  237.     public static Node isIntersect(Node head1,Node head2){  
  238.         Node target=null;  
  239.         if(head1==null||head2==null)return target;  
  240.         int len1=getListLength(head1);  
  241.         int len2=getListLength(head2);  
  242.         if(len1>=len2){  
  243.             for(int i=0;i
  244.                 head1=head1.next;  
  245.             }  
  246.         }else{  
  247.             for(int i=0;i
  248.                 head2=head2.next;  
  249.             }  
  250.         }  
  251.         while(head1!=null&&head2!=null){  
  252.             if(head1==head2){  
  253.                 target=head1;  
  254.                 break;  
  255.             }  
  256.             else{  
  257.                 head1=head1.next;  
  258.                 head2=head2.next;  
  259.             }  
  260.         }  
  261.         return target;  
  262.     }  
  263.     //已知一个单链表中存在环,求进入环中的第一个节点,利用hashmap,不要用ArrayList,因为判断ArrayList是否包含某个元素的效率不高  
  264.     public static Node getFirstNodeInCycleHashMap(Node head){  
  265.         Node target=null;  
  266.         HashMap map=new HashMap();  
  267.         while(head!=null){  
  268.             if(map.containsKey(head))target=head;  
  269.             else{  
  270.                 map.put(head, true);  
  271.             }  
  272.             head=head.next;  
  273.         }  
  274.         return target;  
  275.     }  
  276.     //已知一个单链表中存在环,求进入环中的第一个节点,不用hashmap  
  277.     //用快慢指针,与判断一个单链表中是否有环一样,找到快慢指针第一次相交的节点,此时这个节点距离环开始节点的长度和链表投距离环开始的节点的长度相等  
  278.     public static Node getFirstNodeInCycle(Node head){  
  279.         Node fast=head;  
  280.         Node slow=head;  
  281.         while(fast!=null&&fast.next!=null){  
  282.             slow=slow.next;  
  283.             fast=fast.next.next;  
  284.             if(slow==fast)break;  
  285.         }  
  286.         if(fast==null||fast.next==null)return null;//判断是否包含环  
  287.         //相遇节点距离环开始节点的长度和链表投距离环开始的节点的长度相等  
  288.         slow=head;  
  289.         while(slow!=fast){  
  290.             slow=slow.next;  
  291.             fast=fast.next;  
  292.         }//同步走  
  293.         return slow;  
  294.           
  295.     }  
  296.     //给出一单链表头指针head和一节点指针delete,O(1)时间复杂度删除节点delete  
  297.     //可惜采用将delete节点value值与它下个节点的值互换的方法,但是如果delete是最后一个节点,则不行,但是总得复杂度还是O(1)  
  298.     public static void deleteNode(Node head,Node delete){  
  299.         //首先处理delete节点为最后一个节点的情况  
  300.         if(delete==null)return;  
  301.         if(delete.next==null){  
  302.             if(head==delete)head=null;  
  303.             else{  
  304.                 Node temp=head;  
  305.                 while(temp.next!=delete){  
  306.                     temp=temp.next;  
  307.                 }  
  308.                 temp.next=null;  
  309.             }  
  310.         }  
  311.         else{  
  312.             delete.value=delete.next.value;  
  313.             delete.next=delete.next.next;  
  314.         }  
  315.         return;  
  316.     }  
  317. }  

  1. 转载自http://blog.csdn.net/tayanxunhua/article/details/11100097/

你可能感兴趣的:(java学习)