简要:
其实很多东西和单链表是相同的,就是多了一个pre(指向前一个节点的指针)
注意:
三个辅助节点都是 temp = head;
相关图像:
相关代码:
public class Test {
public static void main(String[] args){
DoubleLinkedList d = new DoubleLinkedList();
Person p1 = new Person (1,"吴中林");
Person p2 = new Person (2,"吴中");
Person p3 = new Person (3,"吴帅");
Person p4 = new Person (1,"胡帅");
d.add(p1);
d.add(p2);
d.add(p3);
System.out.println("--------加入元素后遍历的结果---------");
d.list();
d.update(p4);
System.out.println("--------修改元素后遍历的结果---------");
d.list();
d.delete(1);
System.out.println("--------删除元素后遍历的结果---------");
d.list();
}
}
class DoubleLinkedList{
Person head = new Person(0,"");
//加入一个节点到双向链表的最后。
public void add(Person p){
Person temp=head;
//首先找到这条链表的最后的节点。
while(true){
if(temp.next==null){
break;
}
else{
temp = temp.next;
}
}
//找到节点的时候。 形成一个双向链表。
temp.next = p;
p.pre = temp;
}
//修改双向列表基本上与修改单链表的形式方法是一样的。
public void update(Person p){
Person temp=head;//根据id来进行修改p。
while(true){
if(temp.next==null){
break;
}
else{
if(temp.next.id==p.id){
temp.next.name=p.name;
break;
}
}
}
}
public void delete(int id){//根据id来删除节点。
Person temp=head;
if(head.next==null){
System.out.println("当前链表为空,无法删除。");
}
boolean flag=false; //标识是否找到需要删除的节点。
while(true){
if(temp==null){
break;
}
else{
if(temp.id==id){
flag = true;
break;
}
temp=temp.next;
}
}
if(flag){
temp.pre.next = temp.next;
temp.next.pre = temp.pre;
}
else{
System.out.println("要删除的节点不存在");
}
}
public void list(){
Person temp=head;
if(head.next==null){
System.out.println("链表为空,数据无法列出");
}
while(true){
if(temp.next==null){
break;
}
else {
System.out.println("id="+temp.next.id+" "+"name="+temp.next.name);
temp=temp.next;
}
}
}
}
class Person{
int id;
String name;
Person next; //指向下一个节点。
Person pre; //指向前一个节点。
public Person(int id, String name) {
this.id = id;
this.name = name;
}
}
代码结果: