1.双向链表在单向链表的基础上,增加了一个pre,用于记录一个节点前一个节点的信息。
2.双向链表既可以正向移动,又可以反向移动,因此做删除和增加元素时,不需要通过一个节点的上一个节点辅助,就可以进行
class StudentNode
{
int no;
String name;
//存储上一个节点的信息;
StudentNode pre;
//存储下一个节点的信息
StudentNode next;
public StudentNode(int no, String name) {
this.no = no;
this.name = name;
}
@Override
public String toString() {
return "StudentNode{" +
"no=" + no +
", name='" + name +
'}';
}
}
class DoubleLinkedList
{
StudentNode head=new StudentNode(0,null);
public void add(StudentNode studentNode)
{
StudentNode temp=head;
while(temp.next!=null)
{
temp=temp.next;
}
temp.next=studentNode;
studentNode.pre=temp;
}
public void all()
{
StudentNode temp=head.next;
if(head.next==null)
{
System.out.println("链表为空!不能遍历!");
return;
}
while(temp!=null)
{
System.out.println(temp);
temp=temp.next;
}
}
public void update(StudentNode studentNode)
{
StudentNode temp=head.next;
boolean flag=false;
if(head.next==null)
{
System.out.println("链表为空,不能修改");
return;
}
while(temp!=null)
{
if(temp.no==studentNode.no)
{
System.out.println("编号为"+studentNode.no+"的节点修改成功!");
temp.name=studentNode.name;
flag=true;
break;
}
temp=temp.next;
}
if(!flag){
System.out.println("编号为"+studentNode.no+"的节点不存在!");
}
}
public void delete(int no)
{
StudentNode temp=head;
boolean flag=false;
if(head.next==null)
{
System.out.println("链表为空,不能删除!");
return;
}
while(temp!=null)
{
if(temp.no==no)
{
flag=true;
temp.pre.next=temp.next;
if(temp.next!=null)
{
temp.next.pre=temp.pre;
}
System.out.println("编号为"+no+"的节点删除成功");
}
temp=temp.next;
}
if(!flag) {
System.out.println("删除失败,编号为" + no + "的节点不存在!");
}
}
}
public class Test2 {
public static void main(String[] args) {
StudentNode studentNode1=new StudentNode(1,"郎云松1号");
StudentNode studentNode2=new StudentNode(2,"郎云松2号");
StudentNode studentNode3=new StudentNode(3,"郎云松3号");
StudentNode studentNode5=new StudentNode(5,"郎云松5号");
StudentNode studentNode4=new StudentNode(4,"郎云松4号");
StudentNode studentNode7=new StudentNode(7,"郎云松7号");
StudentNode studentNode6=new StudentNode(6,"郎云松6号");
StudentNode studentNode8=new StudentNode(1,"郎云松1号修改测试");
DoubleLinkedList d=new DoubleLinkedList();
d.add(studentNode1);
d.add(studentNode2);
d.add(studentNode5);
d.add(studentNode7);
d.add(studentNode6);
//测试双向链表是否能够双向查看数据
System.out.println(d.head.next.next.pre);
//测试修改结果
d.update(studentNode8);
//测试删除
d.delete(6);
System.out.println("以下为链表的遍历");
d.all();
}
}
运行结果
StudentNode{no=1, name='郎云松1号}
编号为1的节点修改成功!
编号为6的节点删除成功
以下为链表的遍历
StudentNode{no=1, name='郎云松1号修改测试}
StudentNode{no=2, name='郎云松2号}
StudentNode{no=5, name='郎云松5号}
StudentNode{no=7, name='郎云松7号}