双向链表
双向链表和单链表的区别:
单链表只有一个指向下一个元素的引用next,而双向链表还多一个指向前一个元素的引用pre。在单链表中如果想操作下一个元素必须都得找到下一个元素的上一个元素,用上一个元素来操作。而双链表则不需要。
下面完成双向链表中完成按num的顺序调价元素的方法。
我用学生节点做例子:
学生类:
package doubleLinkedList;
public class Student {
public int num;
public String name;
Student next ;//指向下一个元素、
Student pre;//指向上一个元素
public Student(int num,String name){
this.num = num;
this.name = name;
}
public Student(){}
@Override
public String toString() {
return "[num=" + num + ", name=" + name + "]";
}
}
双链表类:
package doubleLinkedList;
public class DoubleLinkedStudent {
Student head = new Student(0, " ");
// 在双链表中按照num顺序添加一个元素
public void add(Student s) {
Student temp = head;
boolean flag = false;
boolean flag1 = false;
while (true) {
if (temp.num > s.num) {
break;
}//:注意这个判断一定要写在第三个判断前面
if (temp.next == null) {
flag1 = true;
break;
}
if (temp.num == s.num) {
flag = true;
}
temp = temp.next;
}
if (flag) {
System.out.println(s.num + "这个编号已经存在");
} else if (flag1) {
temp.next = s;
s.pre = temp;
} else {
s.next = temp;
temp.pre.next = s;
s.pre = temp.pre;
temp.pre = s;
}
}
// 遍历双链表
public void see() {
Student temp = head.next;
while (true) {
if (temp == null) {
break;
}
System.out.println(temp);
temp = temp.next;
}
}
}
测试类:
package doubleLinkedList;
public class Demo {
public static void main(String[] args) {
Student st1 = new Student(1,"坤坤");
Student st2 = new Student(2,"昊奇");
Student st3 = new Student(3,"思路");
Student st4 = new Student(5,"赵稳");
Student st5 = new Student(4,"正旺");
Student st6 = new Student(4,"文涛");
DoubleLinkedStudent l = new DoubleLinkedStudent();
l.add(st1);
l.add(st2);
l.add(st6);
l.add(st4);
l.add(st3);
l.add(st5);
l.see();
}
}
结果:
思路
先遍历原双向链表,如果找到链表中有元素的num比要插入元素的num大着停止然后将该要插入的元素放到链表中,
或者是找到的同样的num值那么就输出提示信息
或者链表为空、链表遍历完也没有在链表中找到比要插入的元素还大的元素则把要插入的元素放到链表的最后