一、说一下双向链表
1、关于链表
https://blog.csdn.net/qq_38401906/article/details/83715163
2、双向链表
如图:
可以看到双向链表中的节点既保存有前一个节点的引用,也保存有后一个节点的引用,因此比起单链表的节点,双向链表的节点会多一个属性(指向前一个节点)。
二、java实现
节点:
package myStudy.dataStructure.day6;
/**
*
* @description 双向链表节点(既有指向上一个节点的指针,也有指向下一个节点的指针)
* @author shenrenfeng
* @date 2018年11月8日 下午7:35:33
*
*/
public class Node {
private Integer data;// 保存数据
private Node last;// 指向上一个节点
private Node next;// 指向下一个节点
public Node(Integer data) {
this.data = data;
last = null;
next = null;
}
public Integer getData() {
return data;
}
public void setData(Integer data) {
this.data = data;
}
public Node getLast() {
return last;
}
public void setLast(Node last) {
this.last = last;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
双向链表:
package myStudy.dataStructure.day6;
/**
*
* @description 双向链表
* @author shenrenfeng
* @date 2018年11月8日 下午7:23:51
*
*/
public class TwoWayLinkedList {
private Node head;
private Node tail;
/**
* 在头节点后插入
*/
public void insertAfterHead(int data) {
Node node = new Node(data);
if(head == null) {
head = node;
tail = node;
} else {
if(head.getNext() == null) {// 如果只有一个节点,那么新插入的节点即是尾节点
tail = node;
tail.setLast(head);
head.setNext(tail);
} else if(head.getNext() == tail) {// 如果只有两个个节点
node.setLast(head);
node.setNext(head.getNext());
head.setNext(node);
tail.setLast(node);
} else {// 其他情况下尾节点不用变
node.setLast(head);
node.setNext(head.getNext());
head.getNext().setLast(node);
head.setNext(node);
}
}
}
/**
* 在尾节点后插入
*/
public void insertAfterTail(int data) {
Node node = new Node(data);
if(head == null) {
head = node;
tail = node;
} else {
tail.setNext(node);
node.setLast(tail);
tail = node;
}
}
/**
* 从头节点删除
* @return
*/
public Integer deleteFromHead() {
if(head != null) {
Integer data = head.getData();
head = head.getNext();
head.setLast(null);
return data;
} else {
return null;
}
}
/**
* 从尾节点删除
* @return
*/
public Integer deleteFromTail() {
if(tail != null) {
Integer data = tail.getData();
tail = tail.getLast();
tail.setNext(null);
return data;
} else {
return null;
}
}
/**
* 从头节点开始展示数据
*/
public void showListFromHead() {
Node node = head;
while(node != null) {
System.out.print(node.getData() + " ");
node = node.getNext();
}
}
/**
* 从尾节点开始展示数据
*/
public void showListFromTail() {
Node node = tail;
while(node != null) {
System.out.print(node.getData() + " ");
node = node.getLast();
}
}
public Node getHead() {
return head;
}
public void setHead(Node head) {
this.head = head;
}
public Node getTail() {
return tail;
}
public void setTail(Node tail) {
this.tail = tail;
}
}
测试:
package myStudy.dataStructure.day6;
/**
*
* @description
* @author shenrenfeng
* @date 2018年11月8日 下午8:01:28
*
*/
public class Test {
public static void main(String[] args) {
TwoWayLinkedList list = new TwoWayLinkedList();
// 从头节点之后插入数据
list.insertAfterHead(0);
list.insertAfterHead(1);
list.insertAfterHead(2);
list.insertAfterHead(3);
list.insertAfterHead(4);
// 从尾节点之后插入数据
list.insertAfterTail(5);
list.insertAfterTail(6);
list.insertAfterTail(7);
list.insertAfterTail(8);
list.insertAfterTail(9);
// 从头节点开始展示数据
System.out.println("从头节点开始展示数据:");
list.showListFromHead();
System.out.println();
// 从尾节点开始展示数据
System.out.println("从尾节点开始展示数据:");
list.showListFromTail();
System.out.println();
// 从头节点删除数据
System.out.println("从头节点删除数据:" + list.deleteFromHead());
System.out.println("从头节点删除数据:" + list.deleteFromHead());
// 从尾节点删除数据
System.out.println("从尾节点删除数据:" + list.deleteFromTail());
System.out.println("从尾节点删除数据:" + list.deleteFromTail());
// 从头节点开始展示数据
System.out.println("从头节点开始展示数据:");
list.showListFromHead();
System.out.println();
// 从尾节点开始展示数据
System.out.println("从尾节点开始展示数据:");
list.showListFromTail();
}
}
结果: