2019.5.29今日算法題

 

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

技術點:鏈表

思路:從頭節點開始如果下個節點與當前節點重複,則找到第一個與當前不同的節點開始遞歸,反之,保留當前結點並從下一個結點開始遞歸

參考代碼

//節點類ListNode同上
public class Solution {
    public ListNode deleteDuplication(ListNode pHead)
    {
        if (pHead == null || pHead.next == null) { 
            return pHead;//停止遞歸條件
        }
        if (pHead.val == pHead.next.val) {
            //如果下個節點與當前節點重複,則找到第一個與當前不同的節點開始遞歸
            ListNode pNode = pHead.next;
            while (pNode != null && pNode.val == pHead.val) {
                pNode = pNode.next;
            }
            return deleteDuplication(pNode); 
        } else { 
            //反之,保留當前結點,並從下一個結點開始遞歸
            pHead.next = deleteDuplication(pHead.next); 
            return pHead;
        }
    }
}

輸入一個鏈表,輸出該鏈表中倒數第k個結點。

技術點:鏈表

思路:用p1、p2指向鏈表頭部,先讓p1走(k-1)步到達第k個節點,此時p1和p2相隔k個節點;然後p1、p2同時往後移動,當p1到達鏈尾時,p2所在位置正是倒數第k個節點

參考代碼

//節點類ListNode同上
public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        if(head==null||k<=0){
            return null;
        }
        ListNode p1=head;
        ListNode p2=head;       
        //p1先到達第k個節點處
        for(int i=1;i<k;i++){
            if(p1.next!=null){
                p1=p1.next;
            }else{
                return null;
            }
        }
        //p1走到鏈尾時p2正爲倒數第k個節點
        while(p1.next!=null){
            p1=p1.next;
            p2=p2.next;
        }
        return last;
    }
}

 

 

                                                                                                                             by .k

 

關注"編程v",每一天漲一點

STAY HUNGRY & STAY FOOLISH

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