看動畫學演算法之:linkedList
阿新 • • 發佈:2020-10-09
[toc]
# 簡介
linkedList應該是一種非常非常簡單的資料結構了。節點一個一個的連線起來,就成了linkedList。今天我們使用動畫的方法一起來看看linkedList是怎麼插入和刪除的。
# linkedList的構建
linkedList是由一個一個的節點構成的。而每個節點只需要儲存要儲存的資料和下一個節點的引用即可。
![](https://img-blog.csdnimg.cn/20200711205130793.png)
linkedList本身需要一個head節點,所以我們的linkedList可以這樣構建:
~~~java
public class LinkedList {
Node head; // head 節點
//Node表示的是Linked list中的節點,包含一個data資料和下一個節點的引用
class Node {
int data;
Node next;
//Node的建構函式
Node(int d) {
data = d;
}
}
}
~~~
# linkedList的操作
先看一下linkedList怎麼插入資料,插入資料有三種方式,頭部插入,尾部插入,中間插入。
## 頭部插入
先看一個頭部插入的例子:
![](https://img-blog.csdnimg.cn/20200711205530567.gif)
頭部插入的邏輯是什麼呢?
新插入的節點作為head節點,然後將原來的head節點指向當前head節點的next引用即可。
~~~java
//插入到linkedList的頭部
public void push(int newData) {
//構建要插入的節點
Node newNode = new Node(newData);
//新節點的next指向現在的head節點
newNode.next = head;
//現有的head節點指向新的節點
head = newNode;
}
~~~
## 尾部插入
再看一下尾部插入的例子:
![](https://img-blog.csdnimg.cn/20200711210506686.gif)
插入的邏輯是什麼呢?
找到最後一個節點,然後將最後一個節點的next指向新插入的節點。
~~~java
//新節點插入到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;
}
~~~
## 中間插入
再看一下中間插入的例子:
![](https://img-blog.csdnimg.cn/2020071121075628.gif)
這個例子中,我們在第三個節點的位置插入了一個93。
插入邏輯就是先找到第二個節點,將第二個節點的next指向新節點,然後將新節點的next指向原先的第三個節點。
看下java程式碼如何實現:
~~~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;
}
~~~
## 刪除節點
再看一下怎麼刪除某個位置的節點:
![](https://img-blog.csdnimg.cn/20200711211322969.gif)
上面的例子中,我們要刪除第5個節點。
刪除的邏輯就是找到第4個節點和第6個節點。然後將第四個節點的next指向第6個節點即可。
看下相應的java程式碼如下:
~~~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 && inext 是要刪除的節點,刪除節點
Node next = temp.next.next;
temp.next = next;
}
~~~
本文的程式碼地址:
[learn-algorithm](https://github.com/ddean2009/learn-algorithm/tree/master/sorting)
> 本文收錄於 [http://www.flydean.com/algorithm-linked-list/](http://www.flydean.com/algorithm-linked-list/)
>
> 最通俗的解讀,最深刻的乾貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!
>
> 歡迎關注我的公眾號:「程式那些事」,懂技術,更懂你!