offer_56
概要:删除链表中重复的结点
题目描述
:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
/*
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 head = new ListNode(0);
head.next = pHead;
//前结点
ListNode pre = head;
//当前结点
ListNode cur = pHead;
//当前结点与当前结点的下一个结点存在
while(cur != null && cur.next != null)
{
if(cur.val == cur.next.val){//如果当前结点的值与当前结点的下一个结点的值相同
//再判断当前结点的下一个结点是否存在,并且当前结点的值与当前结点的下一个结点的值是否相同
while(cur.next != null && cur.val == cur.next.val){
//如果相同,就把当前结点往后移动;直到当前结点的值与下一个结点的值不同才不移动当前结点位置
cur = cur.next;
}
//已经把与当前结点所有的相同值的结点都划过了,而且当前结点指向的是 与当前结点值相同的结点的 最后一个结点
//把前结点的值指向换成当前结点的下一个,就相当于删除掉了所有的与当前结点相同的值的结点,并且包含当前结点的值
pre.next = cur.next;
//当前结点后移
cur = cur.next;
}else{//如果当前结点的值与当前结点的下一个结点的值不同
//前结点换成当前结点
pre = cur;
//当前结点往后移动
cur = cur.next;
}
}
//因为head是自定义的头结点,要返回原来的链表,应改return的是下一个
return head.next;
}
}