题目描述
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
相关话题: 链表 难度: 中等
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3
思路:
- 定义一个
p
指针遍历链表 - 该题重点是要判断遍历到的节点是否应该删除,很简单,判断条件为
p.next.next != null && p.next.val == p.next.next.val
,就是判断两个相邻节点是否相等;如果不相等,也就是不需要删除,p
前进一位。 - 如果相等,则先记录下节点的值
val
,然后继续遍历下去,若节点的值为val
,则删除,直至遍历到的节点的值不为val
,如下图。
(注意边界问题)
/**
* 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 dummy = new ListNode(0);
dummy.next = head;
head = dummy;
ListNode p = head;
while(p.next != null){
if(p.next.next != null && p.next.val == p.next.next.val){
int val = p.next.val;
while(p.next != null && p.next.val == val){
p.next = p.next.next;
}
}else{
p = p.next;
}
}
return head.next;
}
}
7个月前的做法,不够简洁
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode pHead) {
if(pHead == null) return null;
ListNode dummyNode = new ListNode(0);
dummyNode.next = pHead;
pHead = dummyNode;
int val = 0;
while(pHead.next != null && pHead.next.next != null){
//System.out.println(pHead.next.val);
if(pHead.next.val != pHead.next.next.val){
val = pHead.next.next.val;
pHead = pHead.next;
}else{
while(pHead.next != null && pHead.next.val == val){
pHead.next = pHead.next.next;
}
if(pHead.next != null)
val = pHead.next.val;
}
}
return dummyNode.next;
}
}