双向链表
双向链表
双向链表的增、删、改、遍历思路
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 + '\'' +
'}';
}
}