連結串列之增加頭結點的字首節點
- 在許多連結串列題中往往需要在題目給的頭結點之前增加一個字首節點
- 通常在刪除連結串列和頭結點需要交換時需要用到這一操作
- 因為增加這個節點就避免了對刪除頭結點這種特殊情況的特殊處理
- 而且往往在宣告一個字首節點之後再複製一個,前者儲存不動用於最後結果返回,後者參與之後的操作
Leetcode203刪除連結串列元素
- 給你一個連結串列的頭節點
head
和一個整數val
,請你刪除連結串列中所有滿足Node.val == val
的節點,並返回 新的頭節點 。 - 輸入:head = [1,2,6,3,4,5,6], val = 6
- 輸出:head = [1,2,6,3,4,5,6], val = 6
public ListNode removeElements(ListNode head, int val) {
ListNode prefinalHead=new ListNode(-1,head);
ListNode preHead=prefinalHead;
while(head!=null){
if(head.val==val){
preHead.next=head.next;
}else{
preHead=preHead.next;
}
head=head.next;
}
return prefinalHead.next;
}
Leetcode24兩兩交換連結串列中的節點
- 給你一個連結串列,兩兩交換其中相鄰的節點,並返回交換後連結串列的頭節點。你必須在不修改節點內部的值的情況下完成本題(即,只能進行節點交換)
- 輸入:head=[1,2,3,4]
- 輸出:[2,1,4,3]
public ListNode swapPairs(ListNode head) {
if(head==null){//沒元素
return null;
}
if(head.next==null){//只有一個元素
return head;
}
ListNode pre=head;
ListNode post=head.next;
ListNode finallastpre=new ListNode(-1,head);
ListNode lastpre=finallastpre;
while(pre!=null){
if(post==null){//最後只剩一個節點
pre=pre.next;
}else{
ListNode temp=post.next;
post.next=pre;
lastpre.next=post;
pre.next=temp;
lastpre=pre;
pre=pre.next;
if(temp!=null){
post=temp.next;
}else{
post=null;
}
}
}
return finallastpre.next;
}
Leetcode19刪除連結串列的倒數第N個結點
- 給你一個連結串列,刪除連結串列的倒數第
n
個結點,並且返回連結串列的頭結點 - 輸入:head=[1,2,3,4,5],n=2
- 輸出:[1,2,3,5]
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode prefinalHead=new ListNode(-1,head);
ListNode preHead=prefinalHead;
ListNode fast=head;
ListNode slow=head;
for(int i=1;i<n;i++){
fast=fast.next;
}
while(fast.next!=null){
slow=slow.next;
fast=fast.next;
preHead=preHead.next;
}
preHead.next=slow.next;
return prefinalHead.next;
}