删除链表中重复的结点
1、题目
2、解题
1:直接删除
思路:
- 给链表添加一个表头。
- 遍历链表,每次比较相邻两个节点,如果遇到了两个相邻节点相同,则新开内循环将这一段所有的相同都遍历过去。
- 在第二步中这一连串相同的节点前的节点直接连上后续第一个不相同值的节点。
- 返回时去掉添加的表头。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| public class Solution { public ListNode deleteDuplication(ListNode pHead) { if(pHead == null) return null; ListNode res = new ListNode(0); res.next = pHead; ListNode cur = res; while(cur.next != null && cur.next.next != null){ if(cur.next.val == cur.next.next.val){ int temp = cur.next.val; while (cur.next != null && cur.next.val == temp) cur.next = cur.next.next; } else cur = cur.next; } return res.next; } }
|
2:哈希表
思路:该题是有序链表,可以直接与旁边的元素比较,删除重复的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| import java.util.*; public class Solution { public ListNode deleteDuplication(ListNode pHead) { if(pHead == null) return null; Map<Integer,Integer> mp = new HashMap<>(); ListNode cur = pHead; while(cur != null){ if(mp.containsKey(cur.val)) mp.put(cur.val, (int)mp.get(cur.val) + 1); else mp.put(cur.val,1); cur = cur.next; } ListNode res = new ListNode(0); res.next = pHead; cur = res; while(cur.next != null){ if(mp.get(cur.next.val) != 1) cur.next = cur.next.next; else cur = cur.next; } return res.next; } }
|