题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表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;
}
}