剑指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 }

浙公网安备 33010602011771号