//比单链表 多一个pre
head节点
1.不存放具体的数据
2.作用就是表示单链表头
next 指向下一个节点
pre 指向前一个节点
分析双向链表的遍历,添加,修改,删除的操作
1)遍历
方式和单链表一样 只是可以向前查找也可以向后查找
2)添加(默认添加到双向链表的最后)
先找到双向链表最后的节点
temp.next=newListNode
newListNode.pre=temp
3)修改
思路和原来的单向链表一样
4)删除
(1)因为是双向链表 因此可以实现自我删除
(2)直接找到要删除的这个节点,比如temp
(3)temp.pre.next=temp.next
(4)temp.next.pre=temp.pre
package com.sc.链表;
public class doubleListNode {
public static void main(String[] args) {
//测试
doubleListNodeDemo h1=new doubleListNodeDemo(1,"Curry");
doubleListNodeDemo h2=new doubleListNodeDemo(2,"James");
doubleListNodeDemo h3=new doubleListNodeDemo(3,"Durant");
method1 method2=new method1();
method2.addListNode(h1);
method2.addListNode(h2);
method2.addListNode(h3);
method2.list();
/*
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>");
method2.del(3);
method2.list();
*/
System.out.println("<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
doubleListNodeDemo h4=new doubleListNodeDemo(3,"sc");
method2.update(h4);
method2.list();
}
}
class method1{
//初始化头结点
public static doubleListNodeDemo head=new doubleListNodeDemo(0,"");
//返回头结点
public doubleListNodeDemo getHead(){
return head;
}
//遍历双向链表
public void list(){
if (head.next==null){ //链表为空
return;
}
//定义一个辅助节点
doubleListNodeDemo temp=head.next;
while (true){
if (temp==null){//遍历结束
break;
}else {
System.out.println(temp);
}
temp=temp.next; //往下遍历
}
}
//添加双向链表
public void addListNode(doubleListNodeDemo add){
//定义一个辅助节点
doubleListNodeDemo temp=head;
while (true){
if (temp.next==null){ //遍历结束
break;
}
temp=temp.next;
}
//形成双向链表
temp.next=add;
add.pre=temp;
}
//修改 双向链表的内容修改和单向链表一样
public void update(doubleListNodeDemo newNode){
if (head.next==null){ //链表为空
return;
}
boolean flag=true;
doubleListNodeDemo temp=head.next; //定义一个辅助节点
while (true){
if (temp==null){ //遍历结束 没知道
flag=false;
}else {
if (temp.id==newNode.id){ //找到了
//修改
break;
}
}
temp=temp.next;
}
if (flag==true){ //找到了
temp.id=newNode.id;
temp.name=newNode.name;
}else {//没有找到
System.out.println("无");
}
}
//删除
//对于双向链表 可以直接找到要删除的节点 直接删除即可
public void del(int id){
if (head.next==null){ //链表为空
return;
}
boolean flag=true; //标识符
doubleListNodeDemo temp=head.next; //定义一个辅助节点
while (true){
if (temp==null){ //没有找到遍历结束
flag=false;
}else{
if (temp.id==id){//找到了
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 doubleListNodeDemo{
public int id;
public String name;
public doubleListNodeDemo next; //指向后一个节点 默认为null
public doubleListNodeDemo pre; // 指向前一个节点 默认为null
//构造器
public doubleListNodeDemo(int id,String name){
this.id=id;
this.name=name;
}
@Override
public String toString() {
return "doubleListNodeDemo{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}