• 力扣.82删除链表中的重复元素(java语言实现)


    Problem: 82. 删除排序链表中的重复元素 II

    思路

    思路类似83题的常规解法和建立虚拟头节点的结合,不同的是本题目要删去所有重复节点,为解决该问题我们再次利用虚拟头节点和尾指针,遍历时若遇到当当前节点值和其下一个节点值相等时则说明已经出现重复,则时再次通过循环遍历加上指针的移动操作达到去除所有重复的节点值的目的

    解题方法

    1.建立虚拟头节点,尾指针指向创建的虚拟头节点(便于解决原始待删除的链表头部就出现重复值的情况)
    2.循环退出条件为tail.next != null && tail.next.next != null(假设tail为定义的尾节点)
    3.当出现tail.next.val == tail.next.next.val时表示出现重复,用一个指针(名为noReptition )通过循环遍历,退出条件为noReptition != null && noReptition.val == tail.next.val,然后让tail.next将noReptition指向的节点;若不出现重复,则直接迭代遍历
    4.返回虚拟头节点的下一个节点。

    复杂度

    • 时间复杂度:

    O ( n ) O(n) O(n)

    • 空间复杂度:

    O ( 1 ) O(1) O(1)

    Code

    
    /**
     * 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 {
        //Time Complexity: O(n)
        //Space Complexity: O(1)
        public ListNode deleteDuplicates(ListNode head) {
            if (head == null) return null;
            ListNode dummyNode = new ListNode(Integer.MAX_VALUE,head);
            ListNode tail = dummyNode;
            while (tail.next != null && tail.next.next != null) {
                //出现重复
                if (tail.next.val == tail.next.next.val) {
                    ListNode noReptition = tail.next;
                    while (noReptition != null && noReptition.val == tail.next.val) {
                        noReptition = noReptition.next;
                    }
                    tail.next = noReptition;
                } else {
                    tail = tail.next;
                }
            }
             return dummyNode.next;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
  • 相关阅读:
    Java的封装
    【C++/2023年10月1日】
    Java的数字处理操作
    两个点的距离
    关于命令模式的误区,你知道了吗
    移远EC600U-CN开发板 11.15
    Mac电脑输入正确密码后提示密码错误
    IEEE Transactions on Industrial Electronics工业电子TIE修改稿注意事项及提交须知
    Shell脚本-常用命令
    聊一聊被 .NET程序员 遗忘的 COM 组件
  • 原文地址:https://blog.csdn.net/LNsupermali/article/details/134429697