LeetCode之203. 移除連結串列元素
阿新 • • 發佈:2019-01-03
運用的知識:連結串列 參考:自定義連結串列
題目描述:
刪除連結串列中等於給定值 val 的所有節點。
示例:
輸入: 1->2->6->3->4->5->6, val = 6
輸出: 1->2->3->4->5
方式一:不用虛擬頭結點(比較繁瑣,需要單獨對第一個節點進行判斷。)
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode removeElements(ListNode head, int val) { //單獨判斷頭結點 while(head != null && head.val == val){ ListNode delNode = head; head = head.next; delNode.next = null; } if(head==null){ return null; } //定義一個指標,用於找到要刪除節點的前一個節點 ListNode prev=head; while(prev.next!=null){ if(prev.next.val==val){ ListNode delNode=prev.next; prev.next=delNode.next; delNode.next=null; }else{ prev=prev.next; } } return head; } }
方式二:構造一個虛擬頭結點(存的值為-1):
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode removeElements(ListNode head, int val) { ListNode dummyHead=new ListNode(-1); dummyHead.next=head; ListNode prev=dummyHead; while(prev.next!=null){ if(prev.next.val==val){ ListNode delNode=prev.next; prev.next=delNode.next; delNode.next=null; }else{ prev=prev.next; } } return dummyHead.next; } }
運用的知識:遞迴
方式一:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode removeElements(ListNode head, int val) { //基本問題 if(head==null){ return null; } //更小的同一問題 ListNode result=removeElements(head.next,val); if(head.val==val){ return result; }else{ head.next=result; return head; } } }
對方式一的改進:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeElements(ListNode head, int val) {
if(head==null){
return null;
}
head.next=removeElements(head.next,val);
return head.val==val ? head.next: head;
}
}