题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表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 p = pHead;
ListNode newHead = new ListNode(0);
ListNode q = newHead;
while (p!= null) {
if (p.next == null) {
break;
}
if (p.val != p.next.val) {
ListNode tmp = p.next;
p.next = q.next;
q = q.next = p; // 尾插p结点
p = tmp;
continue;
}
int val = p.val;
while (p.next != null && p.val == p.next.val) {
p = p.next;
}
// p.next为下一个结点
p = p.next;
}
if (p != null) {
// 如果p非null则表明这是最后一个有效结点且元素不重复,故添加在最终链表中
q.next = p;
} else {
q.next = null;
}
return newHead.next;
}
}
题目链接