1. 程式人生 > 其它 >資料結構 連結串列的各種刪除 (刪除連結串列中等於給定值 val 的所有節點)

資料結構 連結串列的各種刪除 (刪除連結串列中等於給定值 val 的所有節點)

技術標籤:資料結構

提示:文章寫完後,目錄可以自動生成,如何生成可參考右邊的幫助文件

文章目錄


1.按照節點的值中間刪除

https://leetcode-cn.com/problems/remove-linked-list-elements/

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        if(head==null){
            return head;
        }
ListNode pre=head; ListNode cur=head.next; while(cur!=null){ if(cur.val==val){ pre.next=cur.next; cur=cur.next; continue; } pre=pre.next; cur=cur.next; } if(head.val==
val){ head=head.next; } return head; } }

這裡先刪除除頭結點外的滿足條件的節點,最後再判定頭結點的值是否滿足條件,然後進行刪除。

2.按照結點刪除

還可以傳入結點來進行刪除,每個結點不同,哪怕是值一樣,也是不同的結點

    public static Node Contains(Node head,Node item){
        Node cur =head;
        for (;cur!=null;cur=cur.next){
            if(cur.val==
item.val){ return cur; } } return null; }
    public static void MidRemove(Node head,Node Delete){
        if(Contains(head,Delete) instanceof Node){
            Node toDelete=Contains(head,Delete);
            toDelete.val=toDelete.next.val;
            toDelete.next=toDelete.next.next;
        }
    }

這裡傳入結點通過上面的Contains函式,來驗證是否存在,這個函式會返回一個結點,然後對這個結點進行刪除,但是這個函式有一個問題就是不能刪除最後一個函式,這是一種比較高效的方法,下面一樣的引數,比較慢一點,但是可以刪除任意部位

    public static Node remove(Node head, Node toDelete) {
        if (head == null) {
            return head;
        }
        if (head == toDelete) {
            // 要刪除的就是頭結點
            head = head.next;
            return head;
        }
        // 1. 先需要找到 toDelete 的前一個節點
        Node prev = head;
        while (prev.next != toDelete) {
            prev = prev.next;
        }
        if (prev == null) {
            // 沒找到
            return head;
        }
        // 2. 進行刪除
        prev.next = toDelete.next;
        return head;
    }

3.按照下標進行刪除

還是找到要刪除結點的頭一個結點,然後修改指向就可以了。

    public static Node RemoveIndex(Node head,int index){
        if(index<0 ||index>=Length(head))
            return null;
        Node cur=head;
        if(index==0){
            cur=cur.next;
            return cur;
        }
        for(int i=0;i<index-1;i++){
            cur=cur.next;
        }
        cur.next=cur.next.next;
        return head;
    }

4.頭部刪除

    public static Node HeadRemove(Node head){
        head=head.next;
        return head;
    }

5.尾部刪除

    public static void LastRemove(Node head){
        Node cur = head;
        while(cur.next.next!=null){
            cur=cur.next;
        }
        cur.next=null;
    }

驗證

        MidRemove(head,10);
        print(head);

        Node Delete = new Node(1);
        MidRemove(head,Delete);
        print(head);

        head=RemoveIndex(head,4);
        print(head);

        head=HeadRemove(head);
        print(head);

        LastRemove(head);
        print(head);

在這裡插入圖片描述