正题
删除排序链表中的重复元素
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。
返回同样按升序排列的结果链表。
示例1:
输入: head = [1,1,2]
输出: [1,2]
示例 2:
输入: head = [1,1,2,3,3]
输出: [1,2,3]
解析: 删除所有重复元素,一眼看来就有2个需求,第一找到重复元素,第二删掉他!
如何找到重复的元素,并且删掉他呢? 非常简单的逻辑:可以通过数字缓存元素的值,遍历链表,将遍历到的值先在数组里面查看是否存在,如果不存在,那么push进数组,如果存在,那么删掉。
第二个问题:如何删?直接用该节点的上一个节点的 next 指针 指向该节点的 next 节点即可。本题的思路非常简单,但是问题在于链表是单向的,无法获取到当前节点的上一个指针。
要解决这个问题,我们可以将当前节点作为 上一个指针,那么判断是否已存在,以及是否要删除的就是该指针的 next 节点了。这样一来,就可以找到要删除的节点,并且删掉它了。
处理边界:
- P为空链表时 return head
代码实现:
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var deleteDuplicates = function(head) {
const list = []
let p = head
if (p) {
list.push(p.val)
while(p.next) {
if (list.indexOf(p.next.val) === -1) {
list.push(p.next.val)
p = p.next
} else {
p.next = p.next.next
}
}
}
return head
};