题目描述
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例:
输入: 1->2->3->3->4->4->5 输出: 1->2->5
思路
1.这道题的核心思想是跳过值重复的结点。
2.可以设置一个哑结点,防止链表中全部的值都是重复的。
3.可以设置两个值,分别用于标记当前结点是否重复。
4.整体流程就是:
- 进入循环
- 保存当前结点
- 循环跳过重复结点
- 判断当前结点是否移动过,若移动过,需要跳过
Java代码实现
public ListNode deleteDuplicates(ListNode head) { if(head == null || head.next == null) return head; ListNode p = new ListNode(-1); ListNode res = p; //记录当前位置的值 int cur = 0; while(head != null){ cur = head.val; ListNode pre = head; //判断是否重复 while(head.next != null && head.next.val == cur){ head = head.next; //防止 1 2 2 这种返回错误答案 p.next = null; } //当前结点是重复值,需要跳过 if(pre != head){ head = head.next; continue; } //移动结点 p.next = head; p = p.next; head = head.next; } return res.next; }