資料結構 鍊錶的一些問題

2021-08-14 05:47:28 字數 2854 閱讀 5708

【題 1】找到鍊錶的倒數第n個節點

【分析】有效方法為使用2個指標node和temp。首先,2個指標都指向表頭結點,僅當temp(沿鍊錶)進行了(n-1)次移動,node開始一起移動,直至temp到達尾節點結束,此時node指標指向的就是倒數第n個節點

public listnode getnodefromend(int n)

listnode node = head, temp = head;

for(int

count = 1; count

< n; count++)

while(temp.getnext() != null)

return node;

}

【題 2】如何判定給定鍊錶是不是環

【分析】floyd環判定演算法。該方法使用2個在鍊錶中不同移動速度的指標。一旦他們進入環就會相遇。

public

boolean

isloop()

}return

false;

}

【題 3】判定給定鍊錶是否是環,如果環存在,找到環的起點

【分析】在判斷是環後,令slow = head,再讓兩個指標每次移動乙個節點,相遇時即為環的起點。

設環的起點是鍊錶的第(m+1)個節點,環有n個節點,相遇時在環的第c個節點,slow移動了x步,fast移動了y步

x = kn + m + c; y = 2x = 2kn + 2m +2c; y - x = kn + m + c = tn(相差的步數應該是n的整數倍);

所以m + c = pn,即m = pn - c

所以slow從head開始移動m + 1步時指向的是環的起點,

fast已經是環的第c個點了,再移動(m+1)步,即(c + pn - c +1) 步,指向節點為

(pn +1) mod n = 1即環的首節點

public listnode findloopbeginnode()

}if(isloop)

return slow;

}return

null;

}

【題 4】如果給定鍊錶存在環,求環的長度

【分析】當在環中slow和fast相遇時,令slow不變,fast繼續移動,步長變為1,記下移動的次數k,當slow與fast再次相遇時,k即為環的長度

public

intlooplength()

}if(isloop)

return k;

}return

0;}

【題 5】逆置單向鍊錶

public

void

reverse()

head.setnext(reversenode);

}

【題 6】假設2個單向鍊錶在某個節點相交後,成為乙個單向鍊錶。兩個鍊錶的表頭節點是已知的,但是相交的節點未知。也就是說它們相交之前各自的節點數是未知的,並且兩個鍊錶的節點數也可能不同。假設鍊錶list1和鍊錶list2在相交前的節點數分別為m和n,那麼m和n的大小是不確定的。請設計演算法找到兩個鍊錶的合併點。

【分析】獲取2個鍊錶長度,計算處長度差d,從較長鍊錶開始移動d步,然後大家一起以相同速度移動,當指標相等時即為合併點

}【題 7】如何查詢鍊錶的中間結點

【分析】使用2個指標,乙個步長2,乙個步長1

方法一

public listnode midnode()else

if(n == 1)

}

return slow.getnext();

}

方法二

public listnode midnode()   

return slow.getnext();

}

【題 8】從表尾開始輸出鍊錶

【分析】運用遞迴

public

void

printfromend(listnode head)

printfromend(head.getnext());

system.out.println(head.getdata());

}

【分析】看做是有n個節點的迴圈鍊錶,每個人給個編號(1~n)

public

int getleader(int n,int m)

p.setnext(list.gethead().getnext()); //設定尾節點指向首節點

//現在p指向的是尾節點

for( init count = n; count > 1; count--)

p.setnext(p.getnext().getnext()); //從鍊錶中刪除淘汰選手

}return

list.gethead().getnext().getdata();

}

關於鍊錶的一些問題的整理

鍊錶的類通常表示如下 public class listnode 一 建立鍊錶 根據給定的陣列使用尾插法和頭插法建立鍊錶 public static listnode createlistnode int array return node private static void addnode l...

資料結構 關於順序表 鍊錶的一些事

一 順序表 的儲存單元依次儲存資料元素的線性結構。2.位址連續的空間,一般情況下採用陣列,陣列有靜態陣列和動態陣列 因此,順序表分為靜態順序表 動態順序表 靜態順序表 結構體變數分別為 乙個陣列 有效元素的個數 datatype array max size 儲存資料的空間 int size 1.有...

關於指標和鍊錶中的一些問題

學習資料結構時對指標和鍊錶很迷糊,也就自己總結 一下,如果有錯誤或者理解上的錯誤歡迎指正,謝謝 指標 指標是什麼,指標就是指標型別,就和int 型別,float型別等一樣,而對於指標個人當時學習的時候總被 弄得迷糊,的作用 1 型別說明符,int p,定義p是乙個指向整型的指標變數,p就是這個位址,...