题目
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5。
分析
设置2个指针:pre,cur
pre的初始值为pHead的前一位,处理一开始就重复的情况
cur的初始值为pHead
1.当cur.val不等于cur.next.val时,两个指针都正常向后移动一位
2.当cur.val等于cur.next.val时,保持pre不动,把cur和cur.next向后移动一位,直到cur.val不等于cur.next.val,之后还要把cur向后移动一位,然后把pre的next指针指向cur
3.重复1,2步骤,直到遍历结束
代码
/*
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 || pHead.next==null){
return pHead;
}
ListNode newHead = new ListNode(0); //引入一个新的头结点,指向链表的头结点
ListNode curNode = pHead;
newHead.next = pHead;
ListNode preNode = newHead;
while(curNode != null){
if(curNode.next!=null && curNode.val == (curNode.next).val){ //当前节点与下一节点不相等时
while(curNode.next!=null && curNode.val == (curNode.next).val){
curNode = curNode.next;
}
curNode = curNode.next;
preNode.next = curNode;
}else{ //当前节点与下一节点相等
preNode = curNode;
curNode = curNode.next;
}
}
return newHead.next;
}
}