代码示例:
package DataStrcture.ArrayDemo.doublelinkedlistdemo;
public class DoubleLinkedListFinalDemo {
///结点类
static class Node {
//指针域和数据域
Node next;
Node pre;
int num;
///构造器和toString()
public Node(int num) {
this.num = num;
}
public String toString() {
return "num= " + num;
}
}
// 头结点, 标识链表的开头
Node head = new Node(0);
///1. 普通添加节点
public void add(Node node) {
///临时结点
Node temp = head;
while (true) {
if (temp.next == null)
break;
temp = temp.next;
}
temp.next = node;
node.pre = temp;
}
///2. 添加结点到指定位置
/手动设置index从1开始
public void addByIndex(Node node, int index){
//临时结点
Node temp = head;
//查找这个位置并插入这个结点
int count=0;
while(true){
if(temp.next == null)
break;
temp = temp.next;
count++;
if(index == count){
//插入结点到当前temp后
node.next = temp.next;
node.pre = temp;
temp.next = node;
依然是跟删除一样的问题
//如果插入到最后一个结点的后面,那么 node.next必然会导致空指针异常
while(node.next != null){
node.next.pre = node;
break;
}
break;
}
}
}
///3. 删除结点
/* 特点: temp指示的结点正是要删除的结点
双链表的删除:
temp.pre.next = temp.next;
temp.next.pre = temp.pre;
*/
public void del(int num){
///临时结点
Node temp = head;
while(true){
if(temp.next == null){
System.out.println("链表为空或者是没找到这个结点");
break;
}
temp = temp.next;
if(temp.num == num){
temp.pre.next = temp.next;
///如果要删除的结点正好是最后一个结点,
这句话中temp.next必然导致空指针异常
//所以我们需要加上这个判断,如果删除最后一个节点则不执行下面这一语句的操作
while(temp.next != null)
temp.next.pre = temp.pre;
break;
}
}
}
///4.查找并修改结点
///alter(要修改的结点值, 需要修改为的值)
public void alter(int target, int val){
//临时结点
Node temp = head;
while(true){
if(temp.next == null){
System.out.println("链表为空或者是没找到这个结点");
break;
}
temp = temp.next;
if(temp.num == target){
temp.num = val;
break;
}
}
}
//5. 遍历链表
public void list(){
//临时变量
Node temp = head;
while(true){
if(temp.next == null)
break;
temp = temp.next;
System.out.println(temp);
}
}
测试类
public static void main(String[] args) {
DoubleLinkedListFinalDemo dl = new DoubleLinkedListFinalDemo();
Node node_1 = new Node(6);
Node node_2 = new Node(1);
Node node_3 = new Node(7);
Node node_4 = new Node(2);
Node node_5 = new Node(9);
Node node_6 = new Node(5);
Node node_7 = new Node(12);
Node node_9 = new Node(79);
Node node_10 = new Node(80);
Node node_8 = new Node(55);///待添加的新节点
dl.add(node_1);
dl.add(node_2);
dl.add(node_3);
dl.add(node_4);
dl.add(node_5);
dl.add(node_6);
dl.add(node_7);
dl.add(node_9);
dl.add(node_10);
System.out.println("1.普通添加后的双链表为: ");
dl.list();
System.out.println("===============================");
System.out.println("2. 添加值为55的新节点到第六个结点之后: ");
dl.addByIndex(node_8, 6);
dl.list();
System.out.println("===============================");
System.out.println("3.删除值为80的那个结点: ");
dl.del(80);
dl.list();
System.out.println("===============================");
System.out.println("4.查找值为7的结点并把它改为100");
dl.alter(7,100);
dl.list();
System.out.println("===============================");
}
}
运行结果: