牛客網刷題之鍊錶入環點 刪除鍊錶中重複節點

2021-09-28 17:14:13 字數 1588 閱讀 2250

題目一描述:

給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出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 賦值原始鍊錶,並將...