给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中没有重复出现的数字。
先考虑的是最简单的情况,假如是空链表,或者链表中只含有一个节点,这种情况下无需比较,直接返回即可。
除此以外,需要逐步比较,设置两个节点,但实际上是两个节点的next指向链表中的节点,这样是为了删除方便,毕竟只是单链表,无法回溯。
class Solution {
public ListNode deleteDuplicates(ListNode head) {
// 若链表为空,或只有一个节点
if(head==null || head.next==null){
return head;
}
// 设置两个节点p、q,实际指向链表的是p.next、q.next
// 时间复杂度为O(n),实际上遍历所花的时间和一遍遍历差不多,虽然是两个while
// temp节点是为了方便返回头节点
ListNode temp = new ListNode(-1);
temp.next = head;
ListNode p = temp;
ListNode q = p.next;
while(q!=null &&q.next!=null){
// 如果两个节点不相等,则都后移一个
if(p.next.val != q.next.val){
p = p.next;
q = q.next;
}
// 如果两个节点相等,则将q节点后移,直到不相等即停,删除中间所有节点
else{
while(q!=null && q.next!=null && p.next.val == q.next.val){
q = q.next;
}
p.next = q.next;
q = q.next;
}
}
return temp.next;
}
}
执行用时:1ms;内存消耗:39.3MB.