刪除單鏈表中重復元素


描述給定一個有序鏈表,若有一個以上相同節點,則將該元素值的節點均刪除。

情形1:

  輸入:1->2->2->3->4->4->5

  輸出:1->3->5

情形2:

  輸入:1->1->1->2->3

  輸出:2->3

 

思路:這道題的難點在於要將重復元素無保留的全部刪除。所以必須要找到重復元素的前一個元素,記作pre。用first指向頭節點用於返回

           針對情形一,pre,node分別指向相鄰的元素,如果node和它后面的元素不同,那么pre和node各自移動一位;如果node和它后面的元素一樣,那么移動node到重復元素的后一位,然后用pre,指向當前node。      外層嵌套一個node.next!=null用於循環

   針對情形二,將node移動到重復元素的后一位,first指向該node。遞歸調用delete方法進行循環

 

代碼:

內部靜態類LinkNode

 1     private static class LinkNode{
 2         private int date;
 3         private LinkNode next=null;
 4         public LinkNode(int date) {
 5             this.date=date;
 6         }
 7         public LinkNode(int date,LinkNode pre) {
 8             this.date=date;
 9             pre.next=this;
10         }
11     }

delete方法

 1     public static LinkNode delete(LinkNode node) {
 2         if(node==null) return null;
 3         if(node.next!=null) {            
 4             LinkNode first=node;
 5             LinkNode pre=node;
 6             node=node.next;
 7             if(first.date!=first.next.date) {
 8                 while(node.next!=null) {
 9                     if(node.date!=node.next.date) {             //如果node和它后面元素,兩個不相等,各自移動
10                         node=node.next;
11                         pre=pre.next;
12                     }else {
13                         while(node.date==node.next.date) {     //如果node和它后面的相等
14                             node=node.next;                        //node移動到最后一個重復元素
15                         }
16                         node=node.next;                            //再移動一個,重復元素的后一個
17                         pre.next=node;                            //pre指向node
18                     }
19                 }
20             }else {
21                 while(node.date==node.next.date) node=node.next;
22                 node=node.next;
23                 first=node;
24                 delete(first);
25             }
26             return first;                    //返回刪除重復元素的指針
27         }
28         return null;
29     }

 

main方法:

 1     public static void main(String[] args) {
 2         LinkNode n1=new LinkNode(1);
 3         LinkNode n2=new LinkNode(1,n1);
 4         LinkNode n3=new LinkNode(1,n2);
 5         LinkNode n4=new LinkNode(2,n3);
 6         LinkNode n5=new LinkNode(3,n4);
 7         LinkNode n6=new LinkNode(4,n5);
 8         LinkNode node=n1;
 9         System.out.println("刪除前:");
10         while(node!=null) {
11             System.out.print(node.date+" ");
12             node=node.next;
13         }
14         System.out.println();
15         LinkNode nodeafterdelete=delete(n1);
16         System.out.println("刪除后:");
17         while(nodeafterdelete!=null) {
18             System.out.print(nodeafterdelete.date+" ");
19             nodeafterdelete=nodeafterdelete.next;
20         }
21         System.out.println();
22     }

結果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM