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