题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
解题思路:
首先定义两个变量cur和pre,开始都指向头节点,用cur来寻找重复的节点,用pre来记录非重复的节点。
分为两种情况:
(1)如果链表从头就开始重复,则需要将头节点重新赋值为删除重复节点后的第一个节点。
(2)如果链表从中间开始重复,则首先寻找到重复节点,此时cur指向的是重复节点的第二个,然后让前边非重复节点的下一个元素直接指向cur的下一个节点即可,此时再让cur继续寻找下一对重复的节点。
最后,返回新的头节点即可。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ListNode deleteDuplication(ListNode pHead)
{
if(pHead == null){
return null;
}
ListNode cur = pHead;
ListNode pre = pHead;
while(cur!= null){
boolean flag = false;
while(cur.next != null && cur.val == cur.next.val){
cur = cur.next;
flag = true;
}
if(flag){
if(cur.val == pHead.val){
pHead = cur.next;
}
pre.next = cur.next;
cur = pre.next;
}
else{
pre = cur;
cur = cur.next;
}
}
return pHead;
}
}