剑指offer:删除链表中重复的结点
题意描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。
输入描述
输入:1->2->3->3->4->4->5
输出:1->2->5
解题思路
一、非递归
遍历链表,使用pre指针保存当前节点,使用last指针保存下一个节点。
- 当
last.val == last.next.val时,向后遍历,找到last.val != last.next.val的节点,连接节点pre.next = last.next。 - 当
last.val != last.next.val时,更新pre、last节点。 - 使用head节点保存头节点,防止出现一开始出现重复节点的情况。
public ListNode deleteDuplication(ListNode pHead){
if(pHead == null || pHead.next == null) return pHead;
ListNode head = new ListNode(0);
head.next = pHead; //保存头节点
ListNode pre = head; //当前节点
ListNode last = head.next; //下一节点
while(last != null){
if(last.next != null && last.val == last.next.val){
while(last.next != null && last.val == last.next.val){
last = last.next; //找到重复节点的最后一个节点
}
pre.next = last.next; //当前节点的下一节点 = 重复节点的最后一个节点的下一节点
last = last.next; //更新last节点
}else{ //last.val != last.next.val
pre = pre.next; //更新当前节点
last = last.next; //更新下一个节点
}
}
return head.next; //返回头节点
}
二、递归
使用last指针保存下一节点。
- 如果
pHead.val == last.val,说明当前节点 = 下一节点。向后找到第一个与当前节点不同的节点,并进入递归,判断新节点是否重复。 pHead.val != last.val,进入递归,将当前节点与下一节点连接,并返回当前节点。- 最后返回头节点。
public ListNode deleteDuplication(ListNode pHead){
if(pHead == null || pHead.next == null) return pHead;
ListNode last = pHead.next; //保存下一节点
if(pHead.val == last.val){ //当前节点 = 下一节点
while(last!=null && pHead.val==last.val){
last = last.next; //找到第一个不重复的节点
}
return deleteDuplication(last); //进入递归,判断下一节点是否重复
}else{ //当前节点 != 下一节点
pHead.next = deleteDuplication(pHead.next); //将两个节点连接
return pHead; //连接后返回当前节点
}
}

浙公网安备 33010602011771号