面試題15求煉表中倒數第K個結點

2021-08-21 03:55:40 字數 2607 閱讀 3460

演算法的分析過程均在**注釋中:

/**

* 題目:輸入乙個單鏈表,輸出該鍊錶從後往前的第k個數。

* ps:從後往前數時從1開始計數。

* @author 柴毛毛大閒人 */

public

class

tailk {

/**

* 分析:要尋找倒數第k個數,很自然想到的方法是:從末尾向前找第k個數。

* 然而這種方法面臨兩個問題:1.我們無法直到單鏈表的末尾在哪兒,2.我們無法從後向前遍歷單鏈表。

* 為了解決上述兩個問題,我們首先想到的方法是:遍歷兩次單鏈表,第一次求得單鏈表的長度n,第二次遍歷到第n-k個元素停止即可。

* **如下: */

//使用全域性變數result表示函式執行結果

static

boolean result = true;

/**

* @param first 單鏈表的首結點

* @param k 要找的倒數第幾個元素

* @return 返回倒數第k個值 */

public

static

intgettailk(nodefirst,int k){

//若煉表為空

if(first==null){

system.out.println("鍊錶為空!");

result = false;

return

0;//若k<=0

if(k<1){

system.out.println("k不能小於1!");

result = false;

return

0;//計算鍊錶長度

int length = 1;

nodep = first;

while(p.next!=null){

length++;

p = p.next;

//若k比鍊錶還長

if(lengthsystem.out.println("k="+k+"超過了鍊錶長度!");

result = false;

return

0;//遍歷鍊錶,遍歷到第n-k個元素結束

nodeq = first;

for(int i=0;iq = q.next;

return q.data;

/**

* 上述方法能解決問題,但需要遍歷鍊錶兩次,能否有更高效的辦法?

* 可以使用兩個指標i和j,指標i從頭開始先走k步,然後j指向第乙個結點,接下來保持i和j之間的距離,當j走到尾時,i指向的結點就是倒數第k個結點。

* **如下: */

public

static

intgettailk_modify(nodefirst,int k){

//若煉表為空

if(first==null){

system.out.println("鍊錶為空!");

result = false;

return

0;//若k<=0

if(k<1){

system.out.println("k不能小於1!");

result = false;

return

0;//定義兩個指標p和q,p指向頭結點,q指向第k個結點

nodep = first;

nodeq = first;

//將q指向第k個結點

for(int i=0;i1;i++){

//若q還沒指向第k個結點,但q已經是最後乙個結點,則說明k超過了鍊錶長度

if(q.next==null){

system.out.println("k="+k+"超過了鍊錶長度!");

result = false;

return

0;q = q.next;

//p和q分別向後移動,直到q走到鍊錶末尾為止

while(q.next!=null){

p = p.next;

q = q.next;

return p.data;

/**

* 測試 */

public

static

void

main(string args){

nodenode1 = new node();

nodenode2 = new node();

nodenode3 = new node();

nodenode4 = new node();

node1.data = 1;

node2.data = 2;

node3.data = 3;

node4.data = 4;

node1.next = node2;

node2.next = node3;

node3.next = node4;

system.out.println(gettailk_modify(node1,11));

/**

* 定義結點 */

class

node

{public t data;

public nodenext;

面試題15 鍊錶中倒數第k個節點

題目 輸入乙個鍊錶,輸出該鍊錶中倒數第k個節點。從1開始計數,如鍊表有1,2,3,4,5,6.倒數第三個節點是值為4的節點。可以採用兩個指標,思路比較清晰,但是就是一些邊界條件很難考慮全,比如k超出了鍊錶的長度。struct listnode class solution if fast null ...

面試題15 鍊錶中倒數第K個節點

鍊錶的定義如下 struct listnode 有三種方法 遞迴法,自定義棧法和前後指標法。如下 listnode findkthtotail listnode head,int k else if k 1 else if k 1 k listnode findkthtotail listnode ...

面試題15 鍊錶中倒數第K個結點

題目 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。為了符合大多數人的習慣,本題從1開始計數,即鍊錶的尾結點是倒數第1個結點。例如乙個鍊錶有6個結點,從頭結點開始它們的值依次是1 2 3 4 5 6。這個鍊錶的倒數第3個結點是值為4的結點。鍊錶的節點定義如下,這裡使用的是c 來定義 public cla...