面試演算法篇 鍊錶

2021-09-26 10:23:41 字數 2713 閱讀 5175

1.如何在一次遞迴後找到單鏈表的中間元素

思路

使用兩個指標,乙個一次走一步,乙個一次走兩步,一次走兩步的走完時,另乙個剛好走到中間.

public listnode findmid(listnode head)

slow = slow.next;

quick = quick.next.next;

}return slow;

}

2.檢查給定的鍊錶中是否包含迴圈鍊錶,並找出迴圈鍊錶的起始節點

思路

1.使用兩個在鍊錶中具有不同移動速度的指標(如:fastnode每次移動兩個節點,slownode每次移動乙個節點),兩個指標同時從表頭開始移動,如果在某一時刻它們相遇了,則表明該鍊錶存在環.

2.在找到環之後,將slownode重新設定為表頭節點,接下來slownode和fastnode每次分別移動乙個節點,當它們再次相遇時即為環的起始節點

證明:

設飛環長度為:c1,整個環的長度為:c2,兩個指標相遇時走過的環中的弧長為:c3

第一次相遇時:

sslow = c1 + c3

sfast = c1 + c2 + c3

且:sfast = 2sslow

則:c1 = c2 – c3

當slownode重置為表頭節點,兩個指標只需要分別移動c1即可第二次相遇:

slownode移動長度:c1,此時slownode的位置是環的開始節點

fastnode移動長度:c1 = c2 – c3,也就是說fastnode此時的位置是:初始位置c3 + c2 – c3 = c2,也就是說fastnode此時剛好移動到環的開始節點,二者相遇

public void findrepeat(listnode listnode)

}if(hasloop)

retrue fastnode;

}retrue null;

}

3.如果鍊錶中存在環,則返回環的長度

思路

1.判定演算法判斷乙個鍊錶是否存在環。

2.在找到環之後,保持fastnode不動,接下來slownode每次移動乙個節點,同時計數器加一,當它們再次相遇時即可求出環的長度

public int findloop(listnode listnode)

}if(hasloop)}}

4.旋轉鍊錶*

思路

例:鍊錶為: 1->2->3->4

k=1, 4->1->2->3 , 1->2->3 4

k=2, 3->4->1->2 , 1->2 3->4

k=3, 2->3->4->1 , 1 2->3->4

1.得到鍊錶長度len,並拿到鍊錶最後乙個node,並把其next從null變成head.

2.k對len求餘,找到切斷點,然後重新修改頭尾指向.

public listnode rotate(listnode head,int k)

int len = 1;

listnode cur = head;

while(null != cur.next)

k = k % len;

if(k == 0)

for(int i=0;i

listnode newnode = cur.next;

cur.next=null;

return cur;

}

5.反轉鍊錶*

思路

修改listnode.next的指標指向,指向前乙個node

1->2->3->4 變成 4->3->2->1

public listnode reserver(listnode headnode)

listnode nextnode = null;

listnode tmpnode = null;

while(headnode != null)

return headnode;

}

6.從表尾一次輸出

思路

遞迴

public listnode printfromend(listnode head)

system.out.print(head.data+" ,");

}

7.環形單鏈表約瑟夫問題

思路

1.先把鍊錶變成環

2.開始迴圈,滿足條件刪除

public listnode josephuskill(listnode head,int k)

listnode last = head;

while(null != last.next)

last.next = head;//成環

int count = 1;

while(head.next != head)else

}return head;

}

面試演算法 鍊錶反轉

今天來將一下面試中經常問到的乙個問題 鍊錶反轉。題目1 給乙個單向鍊錶,請編寫乙個函式,把鍊錶反轉,並把反轉的鍊錶返回。假設給的節點為 class listnode 單向鍊錶反轉函式如下 public listnode reverse1 listnode head return prev 題目2 給...

面試演算法之鍊錶操作集錦

鍊錶操作在面試過程中也是很重要的一部分,因為它和二叉樹一樣都涉及到大量指標的操作,而且鍊錶本身很靈活,很考查程式設計功底,所以是很值得考的地方。下面是本文所要用到鍊錶節點的定義 template struct listnode 鍊錶的建立可以採用下面的 採用尾插法進行鍊錶的建立,返回的鍊錶沒有頭節點...

面試演算法題 1 鍊錶反轉

分享一道面試碰到的演算法題。鍊錶反轉,不借助任何掐資料結構或容器。意思就是把鍊錶尾當成煉表頭,並且每個節點的指標反向。先看下圖 黑色部分是原來鍊錶 紅色部分是翻轉後的鍊錶。思路分析 1 拿到head煉表頭,然後遞迴處理。2 當處理到head節點是,需要把head的next指標置空。3 如果是最後乙個...