單鏈表查詢倒數第N個資料三種思路

2021-10-25 01:18:22 字數 918 閱讀 5120

思路1:

先從頭到尾遍歷一遍鍊錶記錄元素總數,用總數–要查詢位數,重新迴圈遍歷表即可(效率不高就不寫**了)

思路2:

利用快慢指標,定義兩個指標(fast&slow),因為查詢的是倒數第n個位置的資料,快指標先走n步;隨後快慢指標一起走,只要快指標到尾了,慢指標所指的位置就是要查詢的位置

bool

searchlisttail

(linklist l,

int sealoc)

lnode *fast = l-

>next;

lnode *slow = l-

>next;

for(

int i =

0; i < sealoc; i++)}

while

(fast)

cout <<

"the last "

<< sealoc <<

" item is "

<< slow-

>data << endl;

return

false

;}

思路3:

利用遞迴,遞迴遍歷鍊錶,當遞迴觸底時計數器記為0,遞迴返回時依次+1,當計數器和要查詢的位置相同時停止遞迴,輸出

int

cursealisttail

(linklist l,

int sealoc)

return ans;

}

總結

這三個解決方法中,第一種方法不建議使用因為涉及到多次迴圈時間效率肯定不高;遞迴的效率和快慢指標效率的相同,都是要走完表才能知道要查詢的位置在哪。

查詢單鏈表中倒數第n個節點

通過一次遍歷找到單鏈表中倒數第n個節點,鍊錶可能相當大,可使用輔助空間,但是輔助空間的數目必須固定,不能和n有關。單向鍊錶的特點是遍歷到末尾後不能反向重數n個節點。因此必須在到達尾部的同時找到倒數第n個節點。不管是順數n個還是倒數n個,其實都是距離 標尺問題。標尺是一段距離可以用線段的兩個端點來衡量...

刪除單鏈表倒數第n個節點

如何刪除單鏈表中的倒數第n個節點?先遍歷一遍單鏈表,計算出單鏈表的長度,然後,從單鏈表頭部刪除指定的節點。description 刪除單鏈表倒數第n個節點,常規解法.param head param n return listnode public static listnode removenth...

單鏈表查詢倒數第K個節點

分析 p q兩個指標指向表頭結點,p向前移動k個位置後q向前移動,當p結點移到尾結點時,q的next指標域所指結點即為所求結點 若不存在k個結點,則當p指向尾結點時,k不為0。include include typedef struct node node,linklist linklist cre...