思考
题目给出:存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。
首先,可以确定的是 链表是有序链表,然后重复的元素肯定是紧挨着的。
解题思路
设 pre = head, cur = head.next:
- cur节点移动到null,退出循环;
- 判断pre的val是否等于cur的val;
- 不相等,则pre直接指向cur,pre移动到cur,cur移动到下一位;
- 相等,cur继续向下走。
- 重复上述步骤
pre cur
head -> 1 -> 1 -> 2 -> 3 -> 3 -> null;
pre cur
head -> 1 -> 1 -> 2 -> 3 -> 3 -> null;
pre cur
head -> 1 -> 1 -> 2 -> 3 -> 3 -> null;
pre cur
head -> 1 -> 2 -> 3 -> 3 -> null;
pre cur
head -> 1 -> 2 -> 3 -> 3 -> null;
pre cur
head -> 1 -> 2 -> 3 -> 3 -> null;
pre cur
head -> 1 -> 2 -> 3 -> 3 -> null;
pre cur
head -> 1 -> 2 -> 3 -> null;
代码
var deleteDuplicates = function(head) {
if (!head) return head;
let pre = head, cur = head.next;
while (cur) {
if (pre.val != cur.val) {
pre.next = cur;
pre = cur;
cur = cur.next;
} else {
cur = cur.next;
}
}
pre.next = null;
return head;
};