题目描述:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
题解:
(1)需要一个前置结点,用作删除结点后连接之后的结点。
(2)遍历结点,如果当前节点重复就一直往下走,直至走到不重复的结点,让前置结点直接指向这个结点,重复结点即删除。
public ListNode deleteDuplication(ListNode pHead) {
if(pHead == null && pHead.next == null){
return pHead;
}
// 构建新的链表头
ListNode newHead = null;
newHead.next = pHead;
// 将新的链表头当作前置结点
ListNode pre = pHead;
ListNode cur = pHead.next;
while(cur != null){
if(cur.next != null && cur.val == cur.next.val){
while(cur.next != null && cur.val == cur.next.val) {
cur = cur.next;
}
// 直接改变引用,删除重复节点
cur = cur.next;
pre.next = cur;
}else{
pre = cur;
cur = cur.next;
}
}
return newHead.next;
}