看動畫學算法之:linkedList


簡介

linkedList應該是一種非常非常簡單的數據結構了。節點一個一個的連接起來,就成了linkedList。今天我們使用動畫的方法一起來看看linkedList是怎么插入和刪除的。

linkedList的構建

linkedList是由一個一個的節點構成的。而每個節點只需要存儲要保存的數據和下一個節點的引用即可。

linkedList本身需要一個head節點,所以我們的linkedList可以這樣構建:

public class LinkedList {

    Node head; // head 節點

    //Node表示的是Linked list中的節點,包含一個data數據和下一個節點的引用
    class Node {
        int data;
        Node next;
        //Node的構造函數
        Node(int d) {
            data = d;
        }
    }
}

linkedList的操作

先看一下linkedList怎么插入數據,插入數據有三種方式,頭部插入,尾部插入,中間插入。

頭部插入

先看一個頭部插入的例子:

頭部插入的邏輯是什么呢?

新插入的節點作為head節點,然后將原來的head節點指向當前head節點的next引用即可。

    //插入到linkedList的頭部
    public void push(int newData) {
        //構建要插入的節點
        Node newNode = new Node(newData);
        //新節點的next指向現在的head節點
        newNode.next = head;
        //現有的head節點指向新的節點
        head = newNode;
    }

尾部插入

再看一下尾部插入的例子:

插入的邏輯是什么呢?

找到最后一個節點,然后將最后一個節點的next指向新插入的節點。

//新節點插入到list最后面
    public void append(int newData) {
        //創建新節點
        Node newNode = new Node(newData);
        //如果list是空,則新節點作為head節點
        if (head == null) {
            head = newNode;
            return;
        }

        newNode.next = null;
        //找到最后一個節點
        Node last = head;
        while (last.next != null) {
            last = last.next;
        }
        //插入
        last.next = newNode;
        return;
    }

中間插入

再看一下中間插入的例子:

這個例子中,我們在第三個節點的位置插入了一個93。

插入邏輯就是先找到第二個節點,將第二個節點的next指向新節點,然后將新節點的next指向原先的第三個節點。

看下java代碼如何實現:

//插入在第幾個元素之后
    public void insertAfter(int index, int newData) {
        Node prevNode = head;
        for (int i = 1; i < index; i++) {
            if (prevNode == null) {
                System.out.println("輸入的index有誤,請重新輸入");
                return;
            }
            prevNode = prevNode.next;
        }
        //創建新的節點
        Node newNode = new Node(newData);
        //新節點的next指向prevNode的下一個節點
        newNode.next = prevNode.next;
        //將新節點插入在prevNode之后
        prevNode.next = newNode;
    }

刪除節點

再看一下怎么刪除某個位置的節點:

上面的例子中,我們要刪除第5個節點。

刪除的邏輯就是找到第4個節點和第6個節點。然后將第四個節點的next指向第6個節點即可。

看下相應的java代碼如下:

    //刪除特定位置的節點
    void deleteNode(int index)
    {
        // 如果是空的,直接返回
        if (head == null)
            return;

        // head節點
        Node temp = head;

        // 如果是刪除head節點
        if (index == 1)
        {
            head = temp.next;
            return;
        }

        // 找到要刪除節點的前一個節點
        for (int i=1; temp!=null && i<index-1; i++)
            temp = temp.next;

        // 如果超出范圍
        if (temp == null || temp.next == null)
            return;

        // temp->next 是要刪除的節點,刪除節點
        Node next = temp.next.next;
        temp.next = next;
    }

本文的代碼地址:

learn-algorithm

本文收錄於 http://www.flydean.com/algorithm-linked-list/

最通俗的解讀,最深刻的干貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!

歡迎關注我的公眾號:「程序那些事」,懂技術,更懂你!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM