题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
1、思路分析
熟悉的链表指针问题。n指向头结点,用来保存头结点的位置,同时设置一个pre结点,一开始pre结点和n指向相同的位置,头结点更新完成后,n和pre解除绑定。再来说说重复结点的问题,当前结点p与下一个结点q的值相同时,移动q直至其值不再等于p,再让pre的下一个结点为q,p指向q。
2、代码
public class Solution {
public ListNode deleteDuplication(ListNode pHead) {
if(pHead == null) return null;
ListNode p = pHead;
ListNode n = new ListNode(0);
ListNode pre = n;
n.next = pHead;
boolean flag = false;
while(p != null) {
ListNode q = p.next;
if(q == null) {
break;
}
if(q.val == p.val) {
while(q != null && q.val == p.val) {
q = q.next;
}
pre.next = q;
p = q;
}
else {
if(!flag) { // flag为假表明链表的头结点未更新
n.next = p;
flag = true;
}
pre = p;
p = q;
}
}
return n.next;
}
}


京公网安备 11010502036488号