创建一个双链表
双链表的创建和单链表一样,只是多了一个指向前一个节点的pre。
package LinkedList;
public class DoubleLinkedList {
public static void main(String[] args) {
SetDoubleLinked doubleList = new SetDoubleLinked();
Node h1 = new Node(1, "我是一");
Node h2 = new Node(2, "我是二");
Node h3 = new Node(3, "我是三");
Node h4 = new Node(4, "我是四");
Node h5 = new Node(5, "我是五");
Node h6 = new Node(6, "我是六");
Node h7 = new Node(7, "我是七");
Node h8 = new Node(8, "我是八");
Node h9 = new Node(9, "我是九");
Node h10 = new Node(10, "我是十");
//测试add()
doubleList.add(h1);
doubleList.add(h2);
doubleList.add(h3);
doubleList.add(h4);
doubleList.add(h5);
doubleList.add(h6);
doubleList.add(h7);
doubleList.add(h8);
doubleList.add(h9);
doubleList.add(h10);
//测试showLink()
doubleList.showLink(doubleList.getHead());
System.out.println("**************************************************");
doubleList.reverseDoubleLinked();
doubleList.showLink(doubleList.getHead());
/* System.out.println("************************修改**************************");
//测试update()
Node test = new Node(7, "我被修改了");
doubleList.updata(test.no, test);
doubleList.showLink(doubleList.getHead());
System.out.println("************************删除**************************");
//测试delete()
doubleList.delete(10);
doubleList.showLink(doubleList.getHead());
*/
}
}
class SetDoubleLinked {
private Node head = new Node(0, " ");
public Node getHead() {
return head;
}
// 在链表的最后添加节点
public void add(Node node) {
Node temp = head;
//到达链表的尾部
while (true) {
if (temp.next == null) {
break;
}
temp = temp.next;
}
temp.next = node;
node.pre = temp;
}
//遍历链表
public void showLink(Node head) {
if (head.next == null) {
System.out.println("链表为空");
return;
}
Node temp = head.next;
while (temp != null) {
System.out.println(temp.toString());
temp = temp.next;
}
}
//根据no修改一个节点
public void updata(int no1, Node node) {
if (head.next == null) {
System.out.println("链表为空");
return;
}
boolean flag = false;
Node temp = head.next;
while (true) {
if (temp == null) {
break;
}
if (temp.no == no1) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
// temp.pre.next = node;
// node.next = temp.next;
// temp.next.pre = node;
// node.pre = temp.pre;
temp.name = node.name;
} else {
System.out.println("没有找到no为" + no1 + "的节点");
}
}
//根据no删除节点
public void delete(int no) {
if (head.next == null) {
System.out.println("链表为空");
return;
}
Node temp = head.next;
while (true) {
if (temp.no == no) {
temp.pre.next = temp.next;
if (temp.next!=null){
//走到最后一个节点时,需要注意空指针异常
temp.next.pre = temp.pre;}
break;
}temp=temp.next;
}
}
/*反转双链表
关于反转双链表,我的想法是和单链表一样,创建一个辅助节点当做头结点,把第一个节点拉下来与reverse连接
起来,但是需要注意的是第一个节点(Node1)不能放在循环中,因为与头结点结合后Node1.next指向的是null,
而循环中使用的temp.next.pre = temp;会导致空指针异常。
*/
public void reverseDoubleLinked(){
if (getHead()==null){
System.out.println("链表为空!");
return;
}
Node temp = getHead().next;
Node next=null;
Node reverse = new Node(0,"");
next=head.next.next;
temp.next=reverse.next;
reverse.next=temp;
temp.pre=reverse;
temp=next;
while (temp!=null){
next=temp.next;
temp.next=reverse.next;
reverse.next=temp;
temp.pre=reverse;
temp.next.pre = temp;
temp=next;
}
head.next=reverse.next;
head.next.pre=reverse;
}
}
class Node {
public int no;
public String name;
Node next;
Node pre;
public Node(int no, String name) {
this.no = no;
this.name = name;
}
@Override
public String toString() {
return "Node{" +
"no=" + no +
", name='" + name + '\'' +
'}';
}
}