面试题18:删除链表中的重复节点

1、题目描述:

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

2、思路:这道题只能从前往后遍历,若当前节点和下个节点的val值相等,当前这两个节点就是重复节点,是重复节点,就将下一个节点的next节点复制到当前节点上,进行覆盖。

3、代码:

public class Solution {
    public ListNode deleteDuplication(ListNode pHead) {
        if (pHead == null || pHead.next == null) {
            return pHead;
        }
 
        ListNode head = new ListNode(-1); // 新建一个头结点,防止链表中头结点是重复节点被删除。
        ListNode trail = head;
 
        while (pHead != null) {
            ListNode node = pHead.next;
            boolean flag = false;
            //当前节点重复,node后移
            while (node != null && pHead.val == node.val) {
                node = node.next;
                flag = true;
            }
            //若不重复,类似于重建链表了,将pHead这个节点连过来,trail指针后移
            if (!flag) {
                trail.next = pHead;
                trail = trail.next;
            }
            //重复就将node赋值过来,相当于删除了重复节点,因为之前node后移了
            pHead = node;
        }
        
        trail.next = null; // 1->2->3->3->3
        return head.next;
    }
}

猜你喜欢

转载自www.cnblogs.com/guoyu1/p/12228098.html