剑指offer_删除链表中重复的结点

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

首先想到的是先查出哪些元素的值是重复的丢到set里面,然后遍历删除。

 1 /*
 2  public class ListNode {
 3     int val;
 4     ListNode next = null;
 5 
 6     ListNode(int val) {
 7         this.val = val;
 8     }
 9 }
10 */
11 import java.util.HashSet;
12 import java.util.Set;
13 public class Solution {
14     public ListNode deleteDuplication(ListNode pHead)
15     {    
16         if(pHead == null) return null;
17          Set<Integer> set = new HashSet<Integer>();
18          ListNode cur = pHead;
19          while(cur.next!=null) {
20              if(cur.val == cur.next.val) set.add(cur.val);
21              cur = cur.next;
22          }
23         cur = pHead;
24         while(cur.next!=null) {
25              if(set.contains(cur.val)) 
26              {pHead = deleteNode(pHead,cur);}
27             else{
28              cur = cur.next;
29             }
30         }
31      if(set.contains(cur.val)) 
32              {pHead = deleteNode(pHead,cur);}
33          return pHead;
34     }
35     
36     
37     public ListNode deleteNode(ListNode head ,ListNode tobeDelete)
38     {
39     if(head==null||tobeDelete==null) return null;
40     if(tobeDelete.next!=null)
41     {
42         ListNode next = tobeDelete.next;
43         tobeDelete.val =next.val;
44         tobeDelete.next=next.next;
45     }
46     else
47     {
48         if(head==tobeDelete)
49             head=null;
50         else
51         {
52             ListNode cur = head;
53             while(cur.next!=tobeDelete)
54                 cur=cur.next;
55             cur.next=null;
56         }    
57     }
58             return head;
59     }
60 }

另外可以递归删除

 1 public ListNode deleteDuplication(ListNode pHead){
 2     if(pHead == null||pHead.next==null) 
 3         return pHead;
 4     ListNode next = pHead.next;
 5     if(pHead.val=next.val)
 6         {
 7             while(next!=null&&pHead.val==next.val){
 8             next=next.next;
 9         }
10         return deleteDuplication(next);
11     }
12     else{
13         pHead.next=deleteDuplication(pHead.next);
14         return pHead;
15     }
16 }

 

posted @ 2019-08-23 09:57  chyblogs  阅读(129)  评论(0)    收藏  举报