雙向連結串列
雙向連結串列的增、刪、改、遍歷思路
1.增加: 在雙向連結串列的末尾增加;
只需找到最後一個結點temp;
temp.next = newNode;
newNode.pre = temp;
2.指定的位置插入
假設插入到index位置,
有兩種情況:①當temp.next.no > index是則找到該位置,temp為該位置的上一個結點
② 遍歷後到了連結串列尾則直接插入連結串列尾部
3.刪除元素
4.修改元素
public class DoubleLinkList {
public static void main(String[] args) {
Node nodeA = new Node(1, "aaa", "AAA");
Node nodeB = new Node(5, "bbb", "BBB");
Node nodeC = new Node(8, "ccc", "CCC");
Node nodeD = new Node(9, "ddd", "DDD");
DoubleLink listArray = new DoubleLink();
listArray.add(nodeA);
listArray.add(nodeB);
listArray.add(nodeC);
listArray.insert(nodeD,10);
listArray.getList();
// listArray.update(nodeD);
// listArray.delete(nodeC);
// listArray.getList();
}
}
class DoubleLink {
private Node head = new Node(0,"","");
public Node getHead() {
return head;
}
// 遍歷雙向連結串列
public void getList() {
if (head.next == null) {
System.out.println("連結串列為空");
return;
}
Node temp = head;
while (temp.next != null) {
System.out.println(temp.next);
temp =temp.next;
}
}
// 雙向連結串列中新增元素
public void add(Node node) {
Node temp = head;
while (temp.next != null) {
temp = temp.next;
}
temp.next = node; // 在尾部插入要增加的結點
node.pre = temp; // 讓新增的結點的pre指向前一個結點
}
// 修改雙向連結串列的元素
public void update(Node node) {
if (head.next == null) {
System.out.println("連結串列為空");
return;
}
Node temp = head.next;
while (temp.no != node.no) {
if (temp == null) {
System.out.println("未找到該元素");
return;
}
temp =temp.next;
}
temp.name = node.name;
temp.bName = node.bName;
}
// 刪除雙向連結串列的元素
public void delete(Node node) {
if (head.next == null) {
System.out.println("連結串列為空");
return;
}
Node temp = head.next;
while (temp.no != node.no) {
if (temp == null) {
System.out.println("未找到該結點");
return;
}
temp = temp.next;
}
temp.pre.next = temp.next; // 要刪除結點的上一個結點next指向要刪除節點的下一個結點
// 判斷刪除的結點是不是最後一個,如果最後一個則不執行
if (temp.next != null) {
temp.next.pre = temp.pre; //讓當前元素的下一個結點的pre指向當前元素的像一個結點的pre
}
}
// 指定位置插入元素
public void insert(Node node,int index) {
Node temp = head;
boolean flag = false;
while (true) {
if (temp.next == null) {
System.out.println("到尾了,直接插入");
break;
} else if (temp.next.no > index) {
System.out.println("找到了位置");
break;
} else if (temp.next.no == index) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
System.out.println("位置已經存在");
} else {
/**
* 先連線後面的
*/
if (temp.next != null) {
temp.next.pre = node; // 將後一個元素的pre於當前節點的pre相連
node.next = temp.next;
}
/**
* 在連線前面的
*/
temp.next = node;
node.pre = temp;
}
}
}
class Node {
public int no;
public String name;
public String bName;
public Node pre; // 指向上一個結點
public Node next; // 指向下一個結點
public Node(int no, String name, String bName) {
this.no = no;
this.name = name;
this.bName = bName;
}
@Override
public String toString() {
return "Node{" +
"no=" + no +
", name='" + name + '\'' +
", bName='" + bName + '\'' +
'}';
}
}