写了一个双链表,上次的问题依然存在,第一个链表使用addByOrder()方法,第二个链表使用add()方法仍然添加了无关节点,初步推测是add()方法有问题
public class DoubleLinkedListDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Book book1=new Book(1,"Joker");
Book book2=new Book(2,"No face man");
Book book3=new Book(3,"Traveler");
Book book4=new Book(4,"Immortal");
Book book5=new Book(5,"Red sacrifices");
Book book6=new Book(6,"Light trap");
Book book7=new Book(7,"Handed man");
DoubleLinkedList list=new DoubleLinkedList();
list.addByOrder(book5);
list.addByOrder(book1);
list.addByOrder(book4);
list.addByOrder(book2);
list.list();
list.del(4);
Book newbook1=new Book(1,"Clown");
list.update(newbook1);
list.list();
System.out.println();
DoubleLinkedList list2=new DoubleLinkedList();
list2.add(book1);
list2.add(book6);
list2.add(book7);
list2.list();
}
}
class DoubleLinkedList{
private Book head=new Book(0,"");
public Book getHead() {
return head;
}
//遍历双向链表的方法
public void list() {
if(head.next==null) {
System.out.println("链表为空");
return;
}
Book temp=head.next;
while(temp!=null) {
System.out.println(temp);
temp=temp.next;
}
}
//添加一个节点到双向链表的最后
public void add(Book book) {
Book temp=head;
while(temp.next!=null) {
temp=temp.next;
}
temp.next=book;
book.pre=temp;
}
//根据书编号将书加入指定位置
public void addByOrder(Book book) {
Book temp=head;
boolean flag=false;
while(true) {
if(temp.next==null) {
break;
}
if(temp.next.no>book.no) {
break;
}
if(temp.next.no==book.no) {
flag=true;
break;
}
temp=temp.next;
}
if(flag) {
System.out.println("编号已存在,无法添加");
}else {
if(temp.next!=null) {
book.next=temp.next;
temp.next.pre=book;
}
temp.next=book;
book.pre=temp;
}
}
//修改一个节点的内容
public void update(Book book) {
if(head.next==null) {
System.out.println("链表为空");
return;
}
Book temp=head.next;
boolean flag=false;
while(true) {
if(temp==null) {
break;
}
if(temp.no==book.no) {
flag=true;
break;
}
temp=temp.next;
}
if(flag) {
temp.name=book.name;
}else {
System.out.println("没有找到编号为"+book.no+"的节点");
}
}
//删除一个节点
public void del(int no) {
if(head.next==null) {
System.out.println("链表为空,无法删除");
return;
}
Book temp=head.next;
boolean flag=false;
while(true) {
if(temp==null) {
break;
}
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 Book {
public int no;
public String name;
public Book next;
public Book pre;//构建双节点时使用,单节点则没有这一句
//构造器,注意下一个节点Book不用传进来
public Book(int no,String name) {
this.no=no;
this.name=name;
}
//重写一个toString()方法
public String toString() {
return "Book[no="+no+",name="+name+"]";
}
}