Java實現單鏈表的插入、刪除、計算連結串列的長度和輸出連結串列
阿新 • • 發佈:2019-02-10
首先定義單鏈表(以下統稱為連結串列):
連結串列有兩部分:資料和指向下一個節點的指標。
這裡引用書中的一張圖片:
一般是知道頭指標,然後根據頭指標做插入、刪除、反轉、排序、輸出等操作。
使用Java實現連結串列的結構如下:
/**
* 連結串列的結構
* @author haoge
*/
public class Node {
//連結串列節點的資料
int data;
//連結串列指向的下一個節點的指標
Node next = null;
public Node(int data) {
this.data = data;
}
}
連結串列的操作部分:
/**
* 連結串列的插入、刪除、計算長度和列印連結串列
* @author haoge
*
*/
public class MyNode {
public static void main(String[] args) {
MyNode mNode = new MyNode();
//連結串列的頭指標
Node head = null;
//新增節點,第一次新增時需要返回頭指標,用於定位連結串列
head = mNode.insertNode(2, head);
mNode.insertNode(5 , head);
mNode.insertNode(4, head);
mNode.insertNode(3, head);
mNode.insertNode(1, head);
//連結串列的長度
System.out.println("連結串列的長度為:" + mNode.length(head));
//輸出節點
mNode.printList(head);
//刪除節點
if ((head = mNode.deleteNode(2, head)) != null ) {
System.out.println("刪除索引為2的節點後:");
mNode.printList(head);
} else {
System.out.println("刪除失敗!");
mNode.printList(head);
}
//刪除頭結點測試
if ((head = mNode.deleteNode(1, head)) != null) {
System.out.println("刪除頭節點後:");
mNode.printList(head);
} else {
System.out.println("刪除失敗!");
mNode.printList(head);
}
}
/**
* 新增節點
* @param data
*/
public Node insertNode(int data, Node head) {
Node node = new Node(data);
if (head == null) {
head = node;
return head;
}
Node curNode = head;
//迴圈找到當前連結串列的尾節點
while (curNode.next != null) {
curNode = curNode.next;
}
//尾節點的指標指向新增加的節點
curNode.next = node;
return head;
}
/**
* 連結串列的長度
* @return
*/
public int length(Node head) {
Node curNode = head;
int length = 0;
while (curNode != null) {
curNode = curNode.next;
length ++;
}
return length;
}
/**
* 刪除節點
*/
public Node deleteNode(int index, Node head) {
//刪除的節點的索引小於1或者大於連結串列的長度,直接返回false
if (index < 1 || index > length(head)) {
return null;
}
//刪除頭結點
if (index == 1) {
head = head.next;
return head;
}
//從頭結點的下一個節點開始遍歷
Node curNode = head.next;
//記錄當前迴圈的節點的上一個節點用於刪除當前節點
Node preNode = head;
int i = 2;
while (curNode != null) {
if (i == index) {
//前一個節點的next指向當前節點的下一個節點,即刪除當前節點
preNode.next = curNode.next;
break;
} else {
preNode = curNode;
curNode = curNode.next;
}
}
return head;
}
/**
* 列印連結串列
*/
public void printList(Node head) {
Node curNode = head;
//迴圈遍歷到尾節點
while (curNode != null) {
System.out.print(curNode.data + " ");
curNode = curNode.next;
}
System.out.println();
}
}
輸出結果:
連結串列的長度為:5
2 5 4 3 1
刪除索引為2的節點後:
2 4 3 1
刪除頭節點後:
4 3 1