描述:給定一個有序鏈表,若有一個以上相同節點,則將該元素值的節點均刪除。
情形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 }
結果