1. 程式人生 > >cc150:實現一個演算法從一個單鏈表中返回倒數第n個元素

cc150:實現一個演算法從一個單鏈表中返回倒數第n個元素

    實現一個演算法從一個單鏈表中返回倒數第n個元素。

   解答

        這道題的考點在於我們怎麼在一個單鏈表中找到倒數第n個元素? 由於是單鏈表,所以我們沒辦法從最後一個元素數起,然後數n個得到答案。 但這種最直觀的思路顯然是沒錯的,那我們有沒有辦法通過別的方式,從最後的元素數起數 n個來得到我們想要的答案呢。這個次序顛倒的思路可以讓我們聯想到一種資料結構:棧。
       我們如果遍歷一遍單鏈表,將其中的元素壓棧,然後再將元素一一出棧。那麼, 第n個出棧
的元素就是我們想要的。那我們是不是需要顯式地用棧這麼一個結構來做這個問題呢?答案是否。看到棧,我們應當
 要想到遞迴,它是一種天然使用棧的方式。所以,第一種解決方案用遞迴,讓棧自己幫我們從連結串列的最後一個元素數起。思路很簡單,如果指向連結串列的指標還未空,就不斷遞迴。當指標為空時開始退遞迴,這個過程n不斷減1,直接等於1,即可把棧中當前的元素取出。
      遞迴的特點就是理解直接,程式碼短小。所以,很多遞迴程式碼看起來都很漂亮(不包括我這個 

哈,還用了兩個全域性變數,比較不美觀)。

void findNthToLast1(node *head){
    if(head==NULL) return;
    findNthToLast1(head->next);
    if(nn==1) pp = head;
    --nn;
}

       除了遞迴,這道題目還有別的方法還做嗎? 答案

還是有。雖然我們沒辦法從單鏈表的最後一個元素往前數,但如果我們維護兩個指標, 它們之間的距離為n。然後,我將這兩個指標同步地在這個單鏈表上移動,保持它們的距離 為n不變。那麼,當第二個指標指到空時,第一個指標即為所求。很tricky的方法, 將這個問題很漂亮地解決了。

node* findNthToLast(node *head, int n) {
	if(head==NULL || n < 1) return NULL;
	node *p = head,*q = head;
	while(n > 0 && q){
		q = q->next;
		--n;
	}
	if(n > 0) 
	   return NULL;
	while(q) {
		p = q->next;
		q = q->next;
	
	}
		
	return p;
}


相關推薦

cc150:實現一個演算法一個單鏈返回倒數n元素

    實現一個演算法從一個單鏈表中返回倒數第n個元素。    解答         這道題的考點在於我們怎麼在一個單鏈表中找到倒數第n個元素? 由於是單鏈表,所以我們沒辦法從最後一個元素數起,然後數n個得到答案。 但這種最直觀的思路顯然是沒錯的,那我們有沒有辦法通過別

python實現:找出單鏈倒數K元素

1、為了找出倒數第k個元素,最容易想到的辦法是首先遍歷一遍單鏈表,求出整個單鏈表的長度n,然後將倒數第k個,轉換為正數第n-k個,接下來遍歷一次就可以得到結果。但是該方法存在一個問題,即需要對連結串列進行兩次遍歷,第一次遍歷用於求解單鏈表的長度,第二次遍歷用於查詢正數第n-k

演算法]找出單鏈倒數k元素

找出單鏈表中的倒數第k個元素 解題思路: 為了求出連結串列中的倒數第k個元素,最容易想到的方法是首先遍歷一遍單鏈表,求出整個單鏈表的長度n,然後將倒數第k個,轉換為正數第n-k個,接下去遍

單鏈倒數k元素

1. 兩次遍歷法 為了找出倒數第k個元素,最容易想到的辦法是首先遍歷一遍單鏈表,求出整個單鏈表的長度n,然後將倒數第k個,轉換為正數第n-k個, 接下來遍歷一次就可以得到結果。但是該方法存在一個問題,即需要對連結串列進行兩次遍歷,第一次遍歷用於求解單鏈表的長度, 第二次遍歷

Java:如何找出單鏈倒數k元素

設定兩個指標,相差k個節點。//如何找出單鏈表中的倒數第k個元素 public class findelem { public static Node method(Node head,int k)

單鏈刪除倒數k節點(java實現

實現方式很多,在這裡只說兩種實現方式。看不懂時候,大家可以畫畫圖,對理解為什麼很有幫助。 第一種方式: 1.首先判斷K值和連結串列是否為空,如果k<=0,或連結串列為空,直接返回head; 2.滿足上面條件後,定義ListNode P=head,重頭

單鏈刪除倒數K節點 Python 版

題目: 給定一個連結串列,刪除其中倒數第k個結點。 程式碼: class LinkedListAlgorithms(object): def __init__(self): pass def rm_last_kth_nod

2.2 在單鏈和雙鏈刪除倒數K節點

刪除 函數 del 另一個 核心 鏈表 刪除倒數第k個 單鏈表 dex 題目:分別實現兩個函數,一個可以刪除單鏈表中倒數第K個節點,另一個可以刪除雙鏈表中倒數第K個節點 要求:如果鏈表長度為N,時間復雜度達到O(N),額外空間復雜度達到O(1) My: 刪除單鏈表或雙鏈表中

單鏈和雙鏈刪除倒數K節點

題目 分別實現兩個函式,一個可以刪除單鏈表中倒數第K個節點,另一個可以刪除雙鏈表中倒數第K個節點。 要求 如果連結串列長度為n,則要時間複雜度達到O(N),額外空間複雜度達到O(1). 思路 一種方法是設定快慢指標,快指標先走k步,此時慢指標從頭開始走,兩者同時開始走,當

2.2在單鏈和雙鏈刪除倒數K節點

題目 分別實現兩個函式,分別可以刪除單鏈表和雙鏈表中倒數第K個節點。 思路 兩次遍歷連結串列,第一遍每移動一步,就讓K值減1;第二遍從頭開始遍歷連結串列,每移動一步K值加1,加到0就停止遍歷,此時移動到的節點就是要刪除節點的前一個節點。 程式碼實現 c

連結串列問題——在單鏈和雙鏈刪除倒數K節點

【題目】   分別實現兩個函式,一個可以刪除單鏈表中倒數第K個節點,另一個可以刪除雙鏈表中倒數第K個節點。 【要求】   如果連結串列長度為N,時間複雜度達到O(N),時間複雜度達到O(N),額外空間複雜度達到O(1) 【解答】   本題較為簡單,實現

LeetCode演算法19:刪除連結串列的倒數N節點

問題 給定一個連結串列,刪除連結串列的倒數第 n 個節點,並且返回連結串列的頭結點。 示例: 給定一個連結串列: 1->2->3->4->5, 和 n = 2. 當刪除了倒數第二個節點後,連結串列變為 1->2->3->5. 說明: 給定

【LeetCode-面試演算法經典-Java實現】【019-Remove Nth Node From End of List(移除單鏈倒數N節點)】

原題   Given a linked list, remove the nth node from the end of list and return its head.   F

無頭單鏈刪除節點

刪除無頭單鏈表: 程式實現很簡單,主要是思路如果打不開的話,就無從下手。 如果是帶有頭節點的連結串列,直接從頭部遍歷,找到需要刪除的節點,然後直接刪除 刪除的方式,加入目前的節點為node ,前一個節點即為pre pre->next = node->next;

js建立單鏈用於leedcode演算法題目-刪除連結串列的倒數N節點

最近在做leedcode的連結串列題目時,非常頭疼,因為它提供的連結串列不能在我本地的機器上執行。所以我不得不先用js建立一個連結串列,然後才能做題。 連結串列科普: 陣列不總是最佳的資料結構,因為,在很多程式語言中,陣列的長度都是固定的,如果陣列已被資料填滿,

刪除鏈倒數N節點(三種方法實現

from ++ n+1 while end != bsp -- 結點 刪除鏈表的倒數第N個節點 給定一個鏈表,刪除鏈表的倒數第 n 個節點,並且返回鏈表的頭結點。 示例: 給定一個鏈表: 1->2->3->4->5, 和 n = 2. 當刪

連結串列常用操作 單鏈反轉 連結串列中環的檢測 兩有序的連結串列合併 刪除連結串列倒數 n 結點 求連結串列的中間結點

#include <stdio.h> #include <stdlib.h> /**  * 1) 單鏈表反轉  * 2) 連結串列中環的檢測  * 3) 兩個有序的連結串列合併  * 4) 刪除連結串列倒數第 n 個結點  * 5) 求連結串列的中間

單鏈查詢倒數k元素

資料結構期末複習的時候遇到的這題,由於看過小甲魚老師的資料結構視訊,首先想到的想法是快慢指標(這裡說雙指標也許更合適),即第一個指標從頭遍歷到第k-1個元素時第二個指標從頭開始遍歷,第一個指標指向結尾時第二個指標即指向倒數第k個元素。寫完後看了一下參考答案,用的

堅持堅持!用Java寫出刪除一個連結串列的倒數N節點,並返回頭節點(N總是可達的)

這個題目有個前提條件就是N總是可達的,所以直接省去了一種情況(N不可達時的情況) 思路: 資料結構裡面首先給定兩個指標p和q分別都指向這個連結串列的頭節點,然後若想求出這個連結串列的倒數第N個節點,方法就是先讓p向後挪N個位置,q不動。 因為N總是可達的,所以會有倆種情況,

連結串列--如何查詢單鏈倒數k元素

如何查詢單鏈表中倒數第k個元素 思路:因為是單鏈表,只能從頭至尾遍歷。可以設定兩個引用,其中一個引用比另外一個先前移k-1步,然後兩個引用同時開始移動,當先前移的那個引用到達連結串列尾的時候,即指向為