題目
已知乙個帶有表頭結點的單鏈表,結點結構為
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步,之後,再讓兩個指標同...