劍指offer-----刪除連結串列中的重複節點

天--空發表於2018-07-08

1、題目描述

在一個排序的連結串列中,存在重複的結點,請刪除該連結串列中重複的結點,重複的結點不保留,返回連結串列頭指標。 例如,連結串列1->2->3->3->4->4->5 處理後為 1->2->5。

2、思路

  需要兩個指標,一個指向前一個節點preNode,另一個指向當前節點node,如果遇到相等的節點,node向後移動,preNode不動,存下node.val方便後面的比較,直到遇到node和node.next不相等,preNode就可以指向node.next

  注意:連結串列開頭可能就開始有重複的節點,所以預設preNode=null,在後面的給preNode賦值的時候,若preNode為null,那就把pHead設定為node.next

3、程式碼實現

/**

將所有的重複節點都刪除掉

*/

 

 

/*
 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;
        }
        ListNode node = pHead;
        ListNode preNode = null;
        while(node != null){
            ListNode pNext = node.next;
            boolean needDelete = false;
            if(pNext!=null && node.val==pNext.val){
                needDelete = true;
                
            }
            if(!needDelete){
                 preNode = node;
                node = node.next;
              
            }else{
                ListNode toBeDelete = node.next;
                while(toBeDelete!=null && node.val==toBeDelete.val){
                    toBeDelete = toBeDelete.next;
                }
                node = toBeDelete;
                
                if(preNode == null){
                    pHead = node;
                }else{
                    preNode.next = node;
                }
            }
            
        }
        return pHead;


    }
}

 

/**

將每組重複節點只留一個

*/

/*
 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;
        }
        ListNode node = pHead;
        ListNode preNode = null;
        while(node != null){
            ListNode pNext = node.next;
            boolean needDelete = false;
            if(pNext!=null && node.val==pNext.val){
                needDelete = true;
                
            }
            if(!needDelete){
                 preNode = node;
                node = node.next;
              
            }else{
                ListNode toBeDelete = node;//(1)

                while(toBeDelete.next!=null && node.val==toBeDelete.next.val){ //(2)

 

                    toBeDelete = toBeDelete.next; //只有(1)和(2)兩部分與上面的程式碼不一樣
                }
                node = toBeDelete;
                
                if(preNode == null){
                    pHead = node;
                }else{
                    preNode.next = node;
                }
            }
            
        }
        return pHead;


    }
}

 

相關文章