【剑指offer】删除链表中重复的结点
删除链表中重复的结点
http://www.nowcoder.com/questionTerminal/fc533c45b73a41b0b44ccba763f866ef
题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表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; } }