查詢單鏈表倒數第k個位置上的結點(高效演算法)

2021-09-24 21:20:53 字數 1213 閱讀 1316

題目

已知乙個帶有表頭結點的單鏈表,結點結構為

data

link

在不改變鍊錶的前提下,設計乙個盡可能高效的演算法,查詢鍊錶中倒數第k

kk個位置上的結點。若查詢成功,演算法輸出該結點的data域的值,並返回1

11,否則,只返回000。

分析解決這個題目的方法有很多種:

採用兩遍或多遍掃瞄鍊錶,先得到鍊錶長度,再順序掃瞄到l−k

l-kl−

k位置;

採用遞迴演算法,在遞迴返回位置計數,計到k

kk位置;

輔助陣列;

但上述這些方法都不是最優的,我們可以定義兩個指標*p, *q*p*q之間間隔k個結點,且*p在前*q在後,當*q指向尾結點時,由於*p, *q間隔k個結點,所以*p指向的節點就是倒數第k個結點,因此可以先將*q向後移動k個位置,再將*p, *q同時向後移動,直至*q移動到尾結點處。以上過程,只需掃瞄一遍鍊錶,為最有演算法。

**

#include

#include

using

namespace std;

struct lnode

;int

backlocate

(lnode l,

int k)

if(k > count)

//當k大於鍊錶長度時,返回-1

return-1

;return p-

>data;

}int

main()

; lnode l,

*r; r =

null

;for

(int i=

0; i<

10; i++

)else

} r-

>next =

null

;printf

("%d\n"

,backlocate

(l,3))

;}

lesson 14 2 單鏈表查詢倒數第k個結點

題目描述 已知乙個帶有表頭結點的單鏈表,結點結構為 data,link 假設該鍊錶只給出了頭指標list。在不改變鍊錶的前提下,請設計乙個盡可能高效的演算法,查詢鍊錶中倒數第k個位置上的結點。若查詢成功,演算法輸出該結點的data域的值,並返回1 否則,只返回0.思路 定義兩個指標p和q,指標p用來...

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

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

查詢單鏈表的倒數第k個值

剛開始,我想到的是一種笨方法,先遍歷單鏈表,計算出單鏈表的長度len,然後再從頭遍歷單鏈表到第len k個節點,那麼 這個節點既是單鏈表的倒數第k個節點。不過這種演算法時間複雜度挺高的,還有一種更簡單的方法,就是設定兩個指標,分別指向單鏈表的頭節點,然後讓其中乙個指標,先走k步,之後,再讓兩個指標同...