第一部分:题目描述
🏠 链接:83. 删除排序链表中的重复元素 - 力扣(LeetCode)
⭐ 难度:简单
第二部分:代码实现
2.1 快慢指针法
步骤:
- 当节点数小于2时,则不会发生重复节点的情况,无需删除,直接返回。
- 设置快慢指针,慢指针指向头节点head,快指针指向 head 的下一个节点。
- 使用fast指针遍历链表,每次对 fast.val 与 slow.val 进行比较。
- 快慢指针的val值相等,说明当前链表中还存与当前slow指向节点的值相等的节点。不需要理会当前fast指向的节点,直接向后移动一位。当 fast和last的val值不相等的时候,将slow的下一个节点设置为fast即可达到跳过重复节点的效果。
- 快慢指针的val值不相等,说明不再存在与当前slow指向的值相等的其他节点。设置 slow 的下一个节点为当前 fast 指向的节点来达到跳过重复节点的效果,slow后移,fast后移。
- fast 已遍历完链表,为null,slow 也应该指向 null,以跳过 slow 与 fast 之间的节点(肯定是重复节点)。
- 返回头节点。
class Solution { public ListNode deleteDuplicates(ListNode head) { // 当节点数小于2时,则不会发生重复节点的情况,无需删除,直接返回 if (head == null || head.next == null) { return head; } // 慢指针 ListNode slow = head; // 快指针,初始指向 head 的下一个节点 ListNode fast = head.next; // fast 遍历链表,fast == null 说明遍历完成 while (fast != null) { if (slow.val == fast.val) { // 情况一:快慢指针的val值相等,说明当前链表中还存与当前slow指向节点的值相等的节点 // 不需要理会当前fast指向的节点,直接向后移动一位 // 当 fast和last的val值不相等的时候,将slow的下一个节点设置为fast即可达到跳过重复节点的效果 fast = fast.next; } else { // 情况二:快慢指针的val值不相等,说明不再存在与当前slow指向的值相等的其他节点 // 2.1 设置 slow 的下一个节点为当前 fast 指向的节点 slow.next = fast; // 2.2 slow 向后移动 slow = slow.next; // 2.3 fast 向后移动 fast = fast.next; } } // fast 已遍历完链表,为null,slow 也应该指向空 // 例如链表:1 -> 1 -> 3 -> 3 -> null // fast为null时,slow 为第一个3,则需要跳过第二个3,那么 slow 指向 null 或者 fast 即可 slow.next = null; // 返回头节点 return head; } }
2.2 递归
递归函数负责返回:从当前节点(我)开始,完成去重的链表
- 若我与 next 重复,返回 next
- 若我与 next 不重复,返回我,但 next 应当更新
deleteDuplicates(ListNode p=1) { deleteDuplicates(ListNode p=1) { 1.next=deleteDuplicates(ListNode p=2) { 2.next=deleteDuplicates(ListNode p=3) { deleteDuplicates(ListNode p=3) { // 只剩一个节点,返回 return 3 } } return 2 } return 1 } }
代码:
class Solution { public ListNode deleteDuplicates(ListNode head) { // 如果无节点或到了最后一个节点,则返回 null 或 最后一个节点即可 if (head == null || head.next == null) { return head; } if (head.val == head.next.val) { // 如果当前节点的val与下一个节点的val相等 // 则返回下一个节点,就是不保留当前节点,只保留下一个节点 return deleteDuplicates(head.next); } else { // 如果当前节点的val与下一个节点的val不相等 // 则更新当前节点的next head.next = deleteDuplicates(head.next); // 返回当前节点 return head; } } }