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 如果是最後乙個...