10. <tag-链表和去重删除问题>剑指 Offer 18. 删除链表的节点 + lt.83- 删除排序链表中的重复元素 + lt.82- 删除排序链表中的重复元素 II(待补充)

剑指 Offer 18. 删除链表的节点

[案例需求]
在这里插入图片描述
[思路分析]

  • 对于链表的删除, 我们首先要明确一点: 如果采用遍历的方式删除单例表的某个结点, 一定是先遍历到这个节点的前驱结点. 即 temp.next = 待删除结点, 然后再去执行删除操作(temp.next = temp.next.next)
  • 还有一点, 为了保证头结点的删除操作跟其他节点都是相同的, 我们在删除节点时, 一般都需要设置哑结点 dummyNode;
  • 更多关于单链表的基础操作的文章: 点我

[代码示例]

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode deleteNode(ListNode head, int val) {
        //删除需要前驱结点
        ListNode dummyNode = new ListNode(-1);
        dummyNode.next = head;
        ListNode temp = dummyNode;

        while(temp.next != null){
            if(temp.next.val == val){
                temp.next = temp.next.next;
            }else{
                temp = temp.next;
            }
        }

        return dummyNode.next;
    }
}

lt.83- 删除排序链表中的重复元素

[案例需求]
在这里插入图片描述

[思路分析一, 一般性解法]

  • 链表去重就是删除重复的结点, 对于链表的删除, 边界的处理很重要;
  • 本体因为已经是排序的链表, 所以经过一次遍历便可以对链表去重.
    [代码实现]
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        //已经排序. 其实一次遍历就能解决咯
       // ListNode dummyNode = new ListNode(-1);
       // dummyNode.next = head;  // 其实并不需要哑结点/
        ListNode temp = head;

        while(true){
            if(temp == null || temp.next == null)break;
            
            while(temp.next != null && temp.next.val == temp.val){
                temp.next = temp.next.next;
            }

            temp = temp.next;
        }

        return head;
    }
}

[思路分析二, 递归解法]

在这里插入图片描述

[代码实现]

dbc

lt.82- 删除排序链表中的重复元素 II

[案例需求]
在这里插入图片描述

[思路分析]

  • 借鉴剑指 Offer 18的思路, 设置前驱结点, 把重复结点全部删除, 只连接不重复的结点,
  • 本题属于面试高频题目, 有必要掌握迭代和递归两种解法.
  • 待补充(https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/solution/fu-xue-ming-zhu-di-gui-die-dai-yi-pian-t-wy0h/)
    [代码示例]
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        ListNode dummyNode = new ListNode(-1);
        dummyNode.next = head;
        ListNode temp = dummyNode;

        while(temp.next != null && temp.next.next != null){
            
            if(temp.next.val == temp.next.next.val){
                //temp.next = temp.next.next;
                int x = temp.next.val;

                while(temp.next != null && temp.next.val == x){
                    temp.next = temp.next.next;
                }
            }else{
                temp = temp.next;
            }
            
        }

        return dummyNode.next;
    }   
}
posted @ 2022-05-26 20:29  青松城  阅读(40)  评论(0)    收藏  举报