【剑指java版】删除链表中重复的结点

文章来源:
个人博客 翔仔年轻有力量:删除链表中重复的结点

题目描述

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

  1. 给定链表为升序排序。存在待删除的重复节点。
  2. 返回删除节点后的链表头指针
  3. 链表节点的定义如下:
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}

牛客网OJ原题链接:删除链表中重复的结点

思路方法

  • 本题因需要删除节点,故需要另外定义两个辅助节点,其中一个节点myNode1用来修改后链表序列的确认,另一个myNode2用来作为删除时定位及操作的辅助。
  • 当给定的头节点是重复节点时,需要删除。故定义新的不存值的空头节点head,让head指向头节点pHead
  • 初始化:myNode1下一个节点为旧头节点pHeadmyNode2为旧头节点pHead
  • 开始检索,对于每一个非空节点,判定它下一个节点的值是否与本节点值相等,若相等继续向后判定是否存在更多有相同值的节点,并让myNode2指向几个重复节点的最后一个。此时,修改myNode1的下一个节点为myNode2的下一个节点,从而达成删除。
    如:[1,1,2,3,4],myNode1节点值为空,下一个节点为’1’,myNode2节点值为1,向后查找后,myNode2指向了第二个1,下一个节点为’2’。此时myNode1下一个节点指向’2’。从而达成删除

参考代码

public class Solution {
    public ListNode deleteDuplication(ListNode pHead)
    {
        if(pHead == null || pHead.next == null)
            return pHead;
        ListNode head = new ListNode(-1);
        head.next = pHead;
        ListNode myNode1 = head;
        ListNode myNode2 = myNode1.next;
        while(myNode2 != null){
            if(myNode2.next != null && myNode2.val == myNode2.next.val){
                //向后检索重复节点,并定位
                while(myNode2.next != null && myNode2.val == myNode2.next.val)
                    myNode2 = myNode2.next;
                //删除重复节点
                myNode1.next = myNode2.next;
            }else
                //确定不重复,后移,向后检索
                myNode1 = myNode1.next;
            //每次检索,无论是否有重复,myNode2都需要向后移一位
            myNode2 = myNode2.next;
        }
        return head.next;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值