簡介
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;
}
本文的代碼地址:
本文收錄於 http://www.flydean.com/algorithm-linked-list/
最通俗的解讀,最深刻的干貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!
歡迎關注我的公眾號:「程序那些事」,懂技術,更懂你!