24. 兩兩交換連結串列中的節點
給你一個連結串列,兩兩交換其中相鄰的節點,並返回交換後連結串列的頭節點。你必須在不修改節點內部的值的情況下完成本題(即,只能進行節點交換)。
輸入:head = [1,2,3,4]
輸出:[2,1,4,3]
這題很簡單就不寫思路了
public ListNode swapPairs(ListNode head) {
ListNode dummyNode = new ListNode();
dummyNode.next = head;
ListNode tmp = dummyNode;
while(tmp.next!=null&&tmp.next.next!=null){
ListNode next1 = tmp.next;
ListNode next2 = tmp.next.next;
tmp.next = next2;
next1.next = next2.next;
next2.next = next1;
tmp = next1;
}
return dummyNode.next;
}
19.刪除連結串列的倒數第N個節點
給你一個連結串列,刪除連結串列的倒數第 n
個結點,並且返回連結串列的頭結點。
輸入:head = [1,2,3,4,5], n = 2
輸出:[1,2,3,5]
思路 : 先把連結串列的長度size遍歷出來,然後找到size-n位置的節點,把這個節點刪除掉.為了把size-n位置的節點內容刪掉,我只能在開頭構建一個虛擬節點,這樣的話size-n找到的位置就是要刪除節點的前一個節點,這樣方便我做指標變化的刪除操作.綜合來說,此題也是簡單題.
程式碼如下:
public ListNode removeNthFromEnd(ListNode head, int n) {
int size = getSize(head);
int index = size - n;
ListNode dummyNode = new ListNode(0,head);
ListNode tmp = dummyNode;
int i = 0;
while(i!=index){
tmp = tmp.next;
i++;
}
tmp.next = tmp.next.next;
return dummyNode.next;
}
public int getSize(ListNode head){
int size = 0;
while(head!=null){
size++;
head = head.next;
}
return size;
}
面試題 02.07. 連結串列相交
此題目前認為官方題解有問題,還在研究中,暫不討論
142.環形連結串列II
給定一個連結串列的頭節點 head
,返回連結串列開始入環的第一個節點。 如果連結串列無環,則返回 null
。
如果連結串列中有某個節點,可以透過連續跟蹤 next
指標再次到達,則連結串列中存在環。 為了表示給定連結串列中的環,評測系統內部使用整數 pos
來表示連結串列尾連線到連結串列中的位置(索引從 0 開始)。如果 pos
是 -1
,則在該連結串列中沒有環。注意:pos
不作為引數進行傳遞,僅僅是為了標識連結串列的實際情況。
不允許修改 連結串列。
輸入:head = [3,2,0,-4], pos = 1
輸出:返回索引為 1 的連結串列節點
解釋:連結串列中有一個環,其尾部連線到第二個節點。
其實這道題用HashSet寫挺簡單的,HashSet全是優點,使用了陣列+Hashcode+連結串列+紅黑樹,追求極致效能,是基於陣列的實現.
ListNode index = head;
Set<ListNode> visited = new HashSet<ListNode>();
while(index!=null){
if(visited.contains(index)){
return index;
}else{
visited.add(index);
}
index = index.next;
}
return null;