83. 删除排序链表中的重复元素【简单】

leetcode:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list/

 

 

方法一:

迭代遍历

遍历链表,下一个节点与当前节点进行比较,如果相同,则删除下一个节点,否则继续循环下一个节点

/**
 * 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) {
    if (!head || !head.next) return head;
    let temp = head;
    // 遍历,与前一个节点数字相同的删除
    while (temp && temp.next) {
        const next = temp.next;
        if (next.val === temp.val) {
            // 与前一个节点数字相同
            temp.next = next.next;
        } else {
            // 与前一个节点数字不同
            temp = next;
        }
    }
    return head;
};

 

方法二:

递归

递归函数含义:返回去重的链表

边界:节点不存在 或者 节点只有一个 返回当前节点

操作:

1、当前节点与下一个节点数字相同,舍弃当前节点,对剩下节点递归处理,并将递归结果返回

2、当前节点与下一个节点数字不同,保留并返回当前节点,对剩下节点递归处理,并将递归结果作为当前节点的下一个节点

/**
 * 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) {
    // 递归边界
    if (!head || !head.next) return head;
    // 当前节点与下一个节点数字相同,则舍弃当前节点,直到最后只保留相同数字节点的最后一个
    if (head.next.val != head.val) {
        // 当前节点与下一个节点数字不同,当前节点不用舍弃,继续对剩下链表递归处理
        head.next = deleteDuplicates(head.next);
    } else {
        // 当前节点与下一个节点数字相同,舍弃当前节点,直接返回剩下列表递归的结果
        return deleteDuplicates(head.next);
    }
    // 当前节点与下一个节点数字不同的链表结果返回
    return head;
};

 

 

-----smile

posted @ 2021-03-26 10:49  Walker-lyl  阅读(127)  评论(0编辑  收藏  举报