題目一描述:
給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。
題目分析:
鍊錶是否有環使用兩種方式進行判斷(參考牛客網左神演算法課):
1.將鍊錶使用hash進行儲存,如果兩個節點有相同的hash值則表明鍊錶有環
2.使用雙指標,定義乙個快指標和乙個慢指標,快指標每次走兩步,慢指標每次走一步,若煉表有環則快指標一定會與慢指標指向同乙個節點,與此同時,將快指標置於頭部,且設定每次走一步,當兩個指標再次相遇時,為入環節點。
public
class
solution
listnode snode=phead;
//慢指標,每次向前一步
listnode fnode=snode;
//快指標每次走兩步
boolean flag=
false
;//標誌位,表示有環
while
(fnode!=null&&fnode.next!=null)
}while
(flag)
fnode=fnode.next;
snode=snode.next;
}return null;
}}
題目二描述:
在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。 例如,鍊錶1->2->3->3->4->4->5 處理後為 1->2->5
題目分析:
鍊錶需要進行每個節點判斷是否重複,重複將所有重複的節點刪除。因此,需要記錄乙個重複節點(curnode)的前乙個節點(prenode),重複節點的最後乙個節點(nextnode),然後將最後乙個重複節點位置的後乙個節點連線到prenode的next域。
public
class
solution
listnode tounode=
newlistnode(-
1);//頭結點的前乙個節點用來記錄頭結點
tounode.next=phead;
listnode prenode=tounode;
//重複節點的前乙個節點
listnode curnode=prenode.next;
//重複節點的起始節點
listnode nextnode=curnode.next;
//重複節點的下乙個節點
while
(nextnode!=null)
if(nextnode==null)
curnode=nextnode;
//有重複但不為最後的節點,將當前節點指向next指標位置,next指標指向後乙個位置,將cur指標連線在pre的next域
nextnode=curnode.next;
prenode.next=curnode;
}else
}return tounode.next;
//返回的是頭結點的下乙個節點
}}
牛客網刷題 重排鍊錶
將給定的單鏈表 l l0 l1 l ln 重新排序為 l0 ln l1 l l2 l l 要求使用原地演算法,不能改變節點內部的值,需要對實際的節點進行交換。輸入 輸出 線性表 因為鍊錶沒有下表,我們可以現將鍊錶遍歷一遍,儲存到線性表中,然後再重排序 鍊錶中點 鍊錶逆序 合併鍊錶 先查詢鍊錶的中點,...
牛客刷題鍊錶之刪除鍊錶中重複的節點
在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。例如,鍊錶1 2 3 3 4 4 5 處理後為 1 2 5 目前提供兩種方式,第一種通過乙個前指標和當前指標,找到重複節點並刪除 第二種1.首先新增乙個頭節點,以方便碰到第乙個,第二個節點就相同的情況2....
牛客網刷題之複雜鍊錶
題目描述 現在有乙個這樣的鍊錶 鍊錶的每乙個節點都附加了乙個隨機指標,隨機指標可能指向鍊錶中的任意乙個節點或者指向空。請對這個鍊錶進行深拷貝。題目分析 public class solution 當前節點指向複雜鍊錶的頭結點 randomlistnode curnode head 賦值原始鍊錶,並將...