双向链表示意图
遍历链表
//初始化头节点
private ListNode head = new ListNode(0);
//返回头节点
public ListNode getHead() {
return head;
}
//显示链表(遍历)
public void list() {
//判断链表是否为空
if (head.next == null) {
System.out.println("链表为空");
return;
}
//head节点不能动,创建一个辅助变量用来遍历
ListNode temp = head.next;
while (temp != null) { //判断链表是否到最后
System.out.println(temp);
temp = temp.next;
}
}
添加节点
添加到最后
//添加节点到链表最后
public void add(ListNode listNode) {
//head节点不能动,因此创建一个辅助变量temp
ListNode temp = head;
//遍历链表,找到最后
while (temp.next != null) {
temp = temp.next; //没找到链表的最后
}
//退出while循环时,temp就指向了链表的最后
//形成双向链表
temp.next = listNode;
listNode.pre = temp;
}```
## 按顺序添加
```java
//添加节点按照顺序
public void addByOrder(ListNode listNode) {
//head节点不能动,使用辅助变量temp来找到添加位置,temp位于添加位置的前一个节点
ListNode temp = head;
boolean flag = false; //flag标识添加的编号是否已存在,默认为false
//寻找插入位置
while (temp.next != null) { //temp在最后,直接添加
if (temp.next.no > listNode.no) { //找到添加位置(temp后面)
break;
} else if (temp.next.no == listNode.no) { //要添加的编号已存在
flag = true;
break;
}
temp = temp.next; //temp后移,遍历链表
}
//插入链表
if (flag) {
System.out.printf("准备插入的编号%d已存在\n", listNode.no);
} else {
//在temp的后面插入数据
listNode.next = temp.next; //listNode指向temp后面的节点
temp.next = listNode; //temp指向listNode
listNode.pre = temp;
if(listNode.next != null)
listNode.next.pre = listNode;
}
}
修改节点
//修改节点
public void update(ListNode newListNode) {
//判断是否为空
if (head.next == null) {
System.out.println("链表为空");
return;
}
//找到需要修改的节点,根据no编号
ListNode temp = head.next;
boolean flag = false; //标识是否找到该节点
while (temp != null) {
if (temp.no == newListNode.no) { //找到
flag = true;
break;
}
temp = temp.next; //遍历
}
//判断是否已经找到要修改的节点
if (flag) {
//修改语句 newListNode的变量赋给temp
} else {
System.out.printf("没有找到编号为%d的节点\n", newListNode.no);
}
}
删除节点
//删除节点
public void del(int no) {
if(head.next == null){
System.out.println("链表为空");
return;
}
ListNode temp = head.next;
boolean flag = false; //是否找到要删除的节点
while (temp != null) { //直接找要删除的节点,自我删除即可
if (temp.no == no) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
temp.pre.next = temp.next;
if(temp.next != null) //如果要删除最后一个节点,就不需要执行下面的语句,否则会空指针异常
temp.next.pre = temp.pre;
} else {
System.out.println("未找到要删除的节点");
}
}
定义节点
//创建节点
class ListNode{
public int no;
public ListNode next; //指向下一个节点
public ListNode pre; //指向前一个节点
public ListNode(int no) {
this.no = no;
}
@Override
public String toString() {
return "ListNode{" +
"no=" + no +
'}';
}
}