1. 程式人生 > 其它 >單向連結串列的概要以及常規方法

單向連結串列的概要以及常規方法

單向連結串列

單向連結串列由三部分組成

  • 單個的節點

  • 將節點穿起來的連結串列

  • 放入連結串列裡的資料

import javax.xml.soap.Node;

/**
* @author YanAemons
* @date 2021/10/3 17:36
*/
public class NodeC {
int data;
int np;
String names;
NodeC next;
public NodeC(int data, int np, String names)
{
this.np = np;
this.names = names;
this.data = data;
this.next = null;
}



}

節點

每個節點相當於一個帶有方向的容器(也可理解為向量吧),在容器內部放置資料, 該容器還包含一個帶有方向的屬性(類似指標)指向下一個節點,以達到將各個節點連線起來組成單向連結串列,並以此類推

連結串列

/**
* @author YanAemons
* @date 2021/10/3 17:40
*/
public class LinkedList {
private NodeC first;
private NodeC last;
public boolean isEmpty()
{
return first == null;
}
public void print()
{
NodeC current = first;
while (current != null)
{
System.out.println("["+current.data+" "+current.names+" " +current.np+"]");
current = current.next;
}
System.out.println(" ");
}

public void insert(int data, String names, int np)
{
NodeC newNode = new NodeC(data, np, names);
if (this.isEmpty())
{
first = newNode;
last = newNode;
}
else
{
last.next = newNode;
last = newNode;
}
}
}

連結串列由一個一個節點組成,連結串列內將設定其對節點的操作(如增刪改查等),該類包含兩個基本屬性頭指標和尾指標(這同樣也是兩個節點,只不過在連結串列中扮演指標的角色),其他方法將通過控制這兩個指標來對節點進行操作。如上文的insert()方法採用了工廠模式來建立新的節點並修改尾指標來將新節點加入連結串列中,該例insert()方法也定義了容器中的資料包含了哪些內容(data, np, names)

連結串列的使用

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
* @author YanAemons
* @date 2021/10/3 17:58
*/
public class StudentLink {
public static void main(String[] args) throws IOException {
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
int num;
String name;
int score;

System.out.println("請輸入5個學生資料: ");
LinkedList list = new LinkedList();
for (int i = 1; i < 6; i++)
{
System.out.println("輸入學號:");
num = Integer.parseInt(buf.readLine());
System.out.println("請輸入姓名:");
name = buf.readLine();
System.out.println("請輸入成績:");
score = Integer.parseInt(buf.readLine());
list.insert(num, name, score);
System.out.println("-----------");
}
System.out.println("學生成績");
System.out.println("學號成績============");
list.print();
}
}

刪除列表後的節點

將刪除節點的前一個節點的指標,指向欲刪除節點的下一個節點

newNode = first;
tmp = first;
while(newNode.data != delNode.data)
{ // 將頭指標移動到要刪除的前一個節點
tmp = newNode;
newNode = newNode.next
}
tmp.next = delNode.next;

在該示例中節點tmp和newNode同樣扮演的兩個指標,newNode指標的作用是通過while迴圈來根據連結串列方向定位需要刪除的節點的位置,而tmp指標始終在newNode指標的上一個節點,這樣當newNode指標找到需要刪除節點的位置是,tmp指標便定位到delNode節點的前一個節點,更改delNode的前一個節點的指向(也就是跳過delNode節點)便實現了刪除delNode節點

刪除最後一個節點

只要將指向最後一個節點的指標,直接指向null即可

if(last.data == delNode.data)
{
newNode = first;
while(newNode.next != last) newNode = newNode.next;
newNode.next = last.next;
last = newNode;
}

該示例中,指標newNode通過迴圈定位到最後一個節點的前一個節點,並修改last指標

插入與刪除的實現類似

在列表的第一節插入節點

只需把新節點的指正指向表頭,再把表頭一到新節點上即可

最後插入

吧列表的最後一個節點的指標指向新節點,新節點在指向null

在列表中間插入

如果插入的節點在X與Y之間,只需要將X的節點的指標指向新節點,新節點指標指向Y節點即可

單向連結串列的反轉

public void reverse_print()
{
Node current = first;
Node before = null;
while(current != null)
{
last = before;
before = current;
current = current.next;
before.next = last;
}
current = before;
}

在該示例中新增了兩個指標分別是current和before. 在第一次迴圈中就將初始的頭節點的next方向設定為nul. 有三個指標在操作他們從左到右的順序分別是last, before, current. current指標的左右是根據原有的連結串列的方向帶著before指標向前走不斷向前走. before指標定位在current節點的上一個節點, 該指標的左右是修改當前節點的方向,指向last所在的節點. last指標跟在before指標的後面,改節點的作用是定位before節點的前一節點以便於before節點重新指向