给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3
解题思路:
- new一个节点pre指向所给链表的头结点head(即pre.next = head),工作指针q指向头结点head(pre、q分别指向前一个未重复出现的数字(即只出现过一次的数字)和当前pre.next(即q = pre.next)),head = pre
- 判断q的后一个数字和当前数字是否相等,若相等则将q后移至不相等位置(即将q移到重复元素的最后一个)或到链表结尾
- 若q未移动到链表结尾,判断q是否等于pre.next,若相等(即q所指向的元素未重复出现),则pre和q分别往后移一位,若不相等,则pre.next = q.next;q = pre.next,执行步骤2
- 若q移动到链表结尾,判断q是否等于pre.next,若相等(即q所指向的元素未重复出现),则pre.next = q,否则pre.next = null,return head.next;
java代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
ListNode pre = new ListNode(0x3f3f3f3f), q = head;
pre.next = q;
head = pre;
while(null != q) {
while(null != q.next && q.val == q.next.val)
q = q.next;
if(null != q.next) {
if(q == pre.next) {
pre = pre.next;
} else {
pre.next = q.next;
}
} else {
pre.next = q == pre.next ? q : null;
}
q = q.next;
}
return head.next;
}
}