要求
存在一个按升序排列的链表,传入这个链表的头节点 head ,删除所有重复的元素,使每个元素 只出现一次 。
返回同样按升序排列的结果链表。
思路1
创建一个pre指向head
创建一个cur指向head.next
当pre.val == cur.val
pre.next = cur.next
pre指向cur
cur指向cur.next
var deleteDuplicates = function (head) {
if (!head) return null;
let ret = new ListNode(-1, head),
pre = head,
cur = head.next;
while (cur) {
if (pre.val === cur.val) {
pre.next = cur.next;
pre = cur.next;
if(!pre) break;
cur = pre.next;
} else {
pre = pre.next;
cur = cur.next;
}
}
return ret.next;
};
但这个情况下,只能处理重复的元素只出现两次
思路2
创建一个pre指向head
创建一个cur指向head.next
当pre.val != cur.val
pre指向cur,cur指向cur.next
当pre.val == cur.val
只做cur的指针指向下一个:cur = cur.next 的操作
这样,重复的元素出现多次都可以删除掉
代码
var deleteDuplicates = function (head) {
// 当传入的head为空,直接返回null
if (!head) return null;
// 创建两个指针,指向head和head.next,用来判断val是否相等
let pre = head,
cur = head.next;
// 当cur不为空时,才进入循环,cur为空则代表已经把链表遍历完了
while (cur) {
// 当pre的值与cur的值不相等,则两节点不重复
if (pre.val != cur.val) {
// 当前pre指向的节点的next指向当前cur
pre.next = cur;
// pre指针指向当前cur指针指着的节点
pre = cur;
// cur指针指向当前cur指针指着的节点的下一节点
cur = cur.next;
} else {
// 当pre指着的节点的值与cur指着的节点的值相等,两节点重复了,cur指针指向下一节点,继续往下寻找pre节点不等的节点
cur = cur.next;
}
}
// while循环出来后,如果最后pre节点与cur节点重复了,pre直接指向null,如果不重复,则pre会指向最后一个节点
pre.next = null;
return head;
};
};