思路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...