Java leetcode-JZ18 刪除連結串列結點
阿新 • • 發佈:2021-01-13
題目描述
給定單向連結串列的頭指標和一個要刪除的結點的值,定義一個函式刪除該結點,然後返回刪除結點後的連結串列的頭指標。
示例1:
輸入: head = [4,5,1,9], val = 5
輸出: [4,1,9]
解釋: 給定你連結串列中值為 5 的第二個節點,那麼在呼叫了你的函式之後,該連結串列應變為 4 -> 1 -> 9.
示例2:
輸入: head = [4,5,1,9], val = 1
輸出: [4,5,9]
解釋: 給定你連結串列中值為 1 的第三個節點,那麼在呼叫了你的函式之後,該連結串列應變為 4 -> 5 -> 9.
來源:力扣(LeetCode)
連結:刪除連結串列結點
實現程式
第一種方法
public ListNode deleteNode(ListNode head, int val) {
//方便對頭節點的操作,建立啞結點dummyhead
//cur = dummyhed, cur指向當前節點
ListNode dummyhed = new ListNode(1); //啞結點的引用為空,值任意
dummyhed.next = head; //把啞結點和表頭連起來
ListNode cur = dummyhed;
while (cur != null && cur.next != null){
//找到要刪除的結點時,退出迴圈
if(cur.next.val == val){
cur.next = cur.next.next;
break;
}
cur= cur.next; //cur = cur->next,進行連結串列遍歷
}
head = dummyhed.next; //讓head指向dummyhed.next所指向的結點
return head;
}
第二種方法
public ListNode deleteNode(ListNode head, int val) {
//首先判斷連結串列頭是否為空
if(head == null){
return null;
}
//當表頭的值為val時,讓head指向head.next
if(head.val == val){
return head.next;
}
ListNode cur = head;
ListNode prev = null; //起初指向空結點,prev的目的為了指向刪除結點的前一個結點
while(cur.val != val){
prev = cur;
cur = cur.next;
}
//cur指向為刪除的結點
//讓prev指向的結點的next指向cur的下一個結點,這樣就間接刪除了關鍵字為val的結點
prev.next = prev.next.next;
return head;
}