文章来源:
个人博客 翔仔年轻有力量:删除链表中重复的结点
题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5。
- 给定链表为升序排序。存在待删除的重复节点。
- 返回删除节点后的链表头指针
- 链表节点的定义如下:
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
牛客网OJ原题链接:删除链表中重复的结点
思路方法
- 本题因需要删除节点,故需要另外定义两个辅助节点,其中一个节点
myNode1
用来修改后链表序列的确认,另一个myNode2
用来作为删除时定位及操作的辅助。 - 当给定的头节点是重复节点时,需要删除。故定义新的不存值的空头节点
head
,让head
指向头节点pHead
- 初始化:
myNode1
下一个节点为旧头节点pHead
,myNode2
为旧头节点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;
}
}