【編程題】刪除鏈表中重複的結點

牛客網做題鏈接:https://www.nowcoder.com/questionTerminal/fc533c45b73a41b0b44ccba763f866ef
  在一個排序的鏈表中,存在重複的結點,請刪除該鏈表中重複的結點,重複的結點不保留,返回鏈表頭指針。 例如,鏈表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)
            return null;
        // 鏈表只有一個節點,返回
        if(pHead.next == null)
            return pHead;
        
        // 節點的個數大於等於2
        // 帶頭節點的鏈表便於後面的操作
        ListNode newHead = new ListNode(0);
        ListNode end = newHead;    // 哨兵,標記新鏈表的尾部
        newHead.next = pHead;
        
        ListNode p = pHead;
        ListNode q = pHead.next;
        while(q != null){
            // 遇到重複節點
            if(q.val == p.val){
                // 找到所有與重複節點相同的節點
                while(q != null && q.val == p.val){
                    q = q.next;
                }
                // 找到第一個與重複節點不相同的節點
                p = q;
                end.next = p;
                if(q == null){
                    break;
                }
                else{
                    q = q.next;
                }
            }
            else{
                end = p;
                p = q;
                q = q.next;
            }
        }
        return newHead.next;
    }
}

牛客網在線oj:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章