删除排序链表中的重复元素

468 阅读1分钟

正题

删除排序链表中的重复元素

存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。 返回同样按升序排列的结果链表。

示例1:

image.png

输入: head = [1,1,2]
输出: [1,2]

示例 2:

image.png

输入: head = [1,1,2,3,3]
输出: [1,2,3]

解析: 删除所有重复元素,一眼看来就有2个需求,第一找到重复元素,第二删掉他!

如何找到重复的元素,并且删掉他呢? 非常简单的逻辑:可以通过数字缓存元素的值,遍历链表,将遍历到的值先在数组里面查看是否存在,如果不存在,那么push进数组,如果存在,那么删掉。

第二个问题:如何删?直接用该节点的上一个节点的 next 指针 指向该节点的 next 节点即可。本题的思路非常简单,但是问题在于链表是单向的,无法获取到当前节点的上一个指针。

要解决这个问题,我们可以将当前节点作为 上一个指针,那么判断是否已存在,以及是否要删除的就是该指针的 next 节点了。这样一来,就可以找到要删除的节点,并且删掉它了。

1.gif

处理边界:

  • 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
};