剑指offer:删除链表中重复的节点

题目描述

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

解题思路:

本题考查链表的操作,且要全面考虑重复节点所处的位置和删除重复节点后需要对链表做的操作。

step1:是确定删除函数的参数。当然,这个函数需要输入待删除链表的头结点。头结点可能与后面的结点重复,也就是说头结点也可能被删除。

step2:从头开始遍历整个链表。如果当前结点的值和下一个结点的值相同,则它们是重复结点,都可以被删除。为了保证删除之后的链表是连续的,要把当前结点的前一个节点和后面比当前节点的值大的节点相连。要确保pPreNode始终与下一个没有重复的节点连接在一起。

设置头结点,pNode指针,通过pNode指针遍历找到不重复的节点,将它和前一个节点相连。

实现1:

public class Solution {
    public ListNode deleteDuplication(ListNode pHead)
    {
        if(pHead==null){
            return null;
        }
        ListNode pPreNode=null,pNode=pHead;
        while(pNode!=null){
            ListNode pNext=pNode.next;
            boolean isDelete=false;
            if(pNext!=null&&pNext.val==pNode.val){
                isDelete=true;
            }
            if(!isDelete){
                pPreNode=pNode;
                pNode=pNext;
            }else{
                int value=pNode.val;
                ListNode pTobedel=pNode;
                while(pTobedel!=null&&pTobedel.val==value){
                    pNext=pTobedel.next;
                    pTobedel=pNext;
                }
                if(pPreNode==null){
                    pHead=pNext;
                }else{
                    pPreNode.next=pNext;  
                }
                pNode=pNext;
            }
        }
        return pHead;
    }
}

 

方法2:利用递归实现

public class Solution {
    public ListNode deleteDuplication(ListNode pHead)
    {
        //递归实现
        if(pHead==null||pHead.next==null){
            return pHead;
        }
        ListNode curr=pHead.next;
        //如果pHead是重复元素
        if(pHead.val==curr.val){
            curr=curr.next;
            while(curr!=null&&curr.val==pHead.val){
                curr=curr.next;
            }
            pHead=curr;
            return deleteDuplication(curr);
        }else{
            //pHead不是重复元素
            pHead.next=deleteDuplication(curr);
            return pHead;
        }
 
    }
}

方法3:自己增加头节点

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

public class Solution {
    public ListNode deleteDuplication(ListNode pHead){
		ListNode first=new ListNode(-1);//设置一个trick
		first.next=pHead;//保证头结点一定不重复
		ListNode p=pHead;
		ListNode last=first;
		while(p!=null&&p.next!=null){
			if(p.val==p.next.val){
				int val=p.val;
				while(p!=null&&p.val==val){
					p=p.next;
				}
				last.next=p;
			}else{
				last=p;
				p=p.next;
			}
		}
		return first.next;
		
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值