要求
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。
返回同样按升序排列的结果链表。
思路
要删除节点,就要找到删除节点的前一个节点,所以应该head.next.val == head.next.next.val这样判断
当两个val不相等,则继续往下寻找
当两个val相等,cur往下走,pre不需要动
直到cur找到cur.next.val != pre.next.val的节点,使pre改变当前指针所指的下一节点,即pre.next = cur.next
代码
var deleteDuplicates = function (head) {
// 当传进来的head为空,直接return
if (!head) return null;
// 设置一个虚拟头,因为需要删除pre.next,当head的第一第二节点重复需要删除时,要用到虚拟头
let ret = new ListNode(-1, head),
// pre指向虚拟头,当第一第二节点重复时,才能实现删除
pre = ret,
cur = head;
// 为什么要判断cur&&cur.next不为空?
// 因为当cur和cur.next不为空时,才能判断cur.next是否与前面的节点重复
while (cur && cur.next) {
// 当两节点不重复,各往下走一步
if (pre.next.val != cur.next.val) {
pre = pre.next;
cur = cur.next;
// 重复了
} else {
// 则cur继续往下面走,直到找到与当前pre.val不重复的节点
while (cur.next && pre.next.val == cur.next.val) {
cur = cur.next;
}
// 然后pre.next = cur.next,改变pre的下一个节点的指向
pre.next = cur.next;
// cur指针改变指向
cur = cur.next;
}
}
return ret.next;
};