【劍指Offer】56、刪除鏈表中重復的結點


  題目描述:

  在一個排序的鏈表中,存在重復的結點,請刪除該鏈表中重復的結點,重復的結點不保留,返回鏈表頭指針。 例如,鏈表1->2->3->3->4->4->5 處理后為 1->2->5。

  解題思路:

  關於鏈表的大多數題目還是比較簡單的,本題也並不太難。

  刪除重復結點,也就是如果當前結點和下一個結點的值相同,那么就是重復的結點,都可以被刪除,為了保證刪除之后的鏈表的連通性,在刪除之后,要把當前結點前面的結點和下一個沒有重復的結點鏈接起來,為此,程序需要記錄當前的最后一個不重復結點,即程序中的pre。重點在於:一定要確保當前鏈接到鏈表中的一定是不會再重復的結點,具體見代碼實現。

  關於第一個結點如果重復怎么辦的問題,我們不用單獨考慮,可以使用鏈表中一貫的做法,加一個頭結點即可。

  具體思路看代碼比較直觀,參考如下的代碼實現。

  舉例:

  編程實現(Java):

/*
 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 head=new ListNode(-1);  //添加頭結點
        head.next=pHead;

        ListNode last=head,cur=pHead;
        while(cur!=null && cur.next!=null){
            if(cur.val!=cur.next.val){
                last=cur;
                cur=cur.next;
            }else{
                int val=cur.val;
                while(cur!=null && cur.val==val)
                    cur=cur.next;
                last.next=cur;
            }
        }
        return head.next;
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM