删除链表中的重复节点

https://www.nowcoder.com/questionTerminal/fc533c45b73a41b0b44ccba763f866ef

描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

解析

需要注意到,重复的节点都删除。那就还需要一个节点保持前一个指针。所以需要三个指针来操作。

代码

/*
 public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    public ListNode deleteDuplication(ListNode pHead) {
        if (null == pHead) {
            return null;
        }
        //新建一个节点,防止头结点要被删除
        ListNode newHead = new ListNode(-1);
        newHead.next = pHead;
        ListNode pre = newHead;
        ListNode p = pHead;
        ListNode next;
        while (p != null && p.next != null) {
            next = p.next;
            if (p.val == next.val) {//如果当前节点的值和下一个节点的值相等
                while (next != null && p.val == next.val) {//向后重复查找
                    next = next.next;
                }
                pre.next = next;//指针赋值,就相当于删除
                p = next;
            } else {//如果当前节点和下一个节点值不等,则向后移动一位
                pre = p;
                p = p.next;
            }
        }
        return newHead.next;//返回头结点的下一个节点
    }
}

 相似问题:[LeetCode] 83. Remove Duplicates from Sorted List ☆(从有序链表中删除重复项)

原文地址:https://www.cnblogs.com/fanguangdexiaoyuer/p/10770298.html