定义双链表基本操作
package Link;
class DoubleNode{
public int value; // 该结点所保存的值
public DoubleNode next; // da该结点下一个结点指针
public DoubleNode last; // da该结点上一个结点指针
public DoubleNode(int data){
value = data;
next = null;
last =null;
}
public DoubleNode(){
next = null;
last =null;
}
}
// 定义双链表基本操作
public class DoubleLinkList{
DoubleNode head = null; // 头结点为空
// 尾插法创建双链表
public DoubleNode TailCreateLinkList(int[] arr){
int len = arr.length;
if(len == 0){
System.out.println("创建空链表");
return head;
}
head = new DoubleNode(arr[0]);
DoubleNode pre = head;
for(int i = 1;i < len;i++){
DoubleNode doublenode = new DoubleNode(arr[i]);
pre.next = doublenode;
doublenode.last = pre;
pre = doublenode;
}
return head;
}
// 头插法创建双链表
public DoubleNode HeadCreateLinkList(int[] arr){
int len = arr.length;
if(len == 0){
System.out.println("创建空链表");
return head;
}
head = new DoubleNode(arr[0]);
for(int i = 1;i < len;i++){
DoubleNode doublenode = new DoubleNode(arr[i]);
doublenode.next = head;// 在链表头部插入结点
head.last = doublenode;
head = doublenode; // 每一个新插入的结点都成为新的头结点
}
return head;
}
public void PrintDoubleLinkList(DoubleNode head){
if(head == null){
System.out.println("链表为空!");
return;
}
DoubleNode pre = head;
DoubleNode q = new DoubleNode();
System.out.println();
System.out.print("顺序输出链表:");
while (pre != null){
System.out.print(pre.value + "\t");
q = pre;
pre = pre.next;
}
System.out.println();
System.out.print("逆序输出链表:");
while (q != null){
System.out.print(q.value + "\t");
q = q.last;
}
}
public int DoubleLinkLength(Node head){
int len = 0;
if(head == null){
System.out.println("链表为空");
return 0;
}
while(head != null){
len++;
head = head.next;
}
return len;
}
public DoubleNode DoubleLinkListInverse(DoubleNode head){
if(head == null){
System.out.println("空链表!");
return head;
}
DoubleNode p = head;
DoubleNode q = p.next;
if(q == null){
System.out.println("链表只有一个值,不用翻转!");
return head;
}
while(q != null){
p.next = q.next;
if(q.next != null){
q.next.last = p;
}
q.next = head;
head.last = q;
q.last = null;
head = q;
q = p.next;
// PrintDoubleLinkList(head); // 打印链表
// System.out.println();
}
// PrintDoubleLinkList(head); // 打印链表
// System.out.println();
return head;
}
public DoubleNode DeleteDoubleLinkElements(int a,DoubleNode head){
if(head == null){
System.out.println("空链表!");
return head;
}
while(head.value == a){ // 头结点的值等于待删除的值,单独处理
head = head.next;
if(head == null){
return head;
}
head.last = null;
}
DoubleNode pre = head; // 指向当前结点的前一结点
DoubleNode q = pre.next;
while(q != null){
if(q.value == a){ // 当前结点值恰好为待删除的值,pre指针不用移动,因为删除一个q结点之后会带来一个新的q结点
pre.next = q.next;
if(q.next != null){ // q的下一结点为空,则不会有last,要注意了!
q.next.last = pre;
}
q = pre.next;
}
else{ // 当前值不等于待删除值,当前结点指针后移
pre = pre.next;
q = pre.next;
}
}
return head;
}
}
主函数
package Link;
public class DoubleLinkListInverse {
public static void main(String[] args) {
// int [] arr = new int[] {1,3,4,7,3,0,8,2};
int [] arr = new int[] {3,3,3,1,3,4,3,3,3,7,3,0,8,2,3,3,3};
// int [] arr = new int[] {3,3,3,3,3,3,3,3,3,3,3};
DoubleLinkList doubleLinkList = new DoubleLinkList();
System.out.println();
System.out.println("--------尾插法创建双链表--------");
System.out.println();
DoubleNode tail = doubleLinkList.TailCreateLinkList(arr); // 尾插法
doubleLinkList.PrintDoubleLinkList(tail);
// DoubleLinkList doubleLinkList1 = new DoubleLinkList();
// DoubleNode head = doubleLinkList1.HeadCreateLinkList(arr); // 头插法
// doubleLinkList1.PrintDoubleLinkList(head);
System.out.println("--------双链表反转--------");
System.out.println();
tail = doubleLinkList.DoubleLinkListInverse(tail);
doubleLinkList.PrintDoubleLinkList(tail);
System.out.println();
System.out.println("--------删除所有给定值--------");
tail = doubleLinkList.DeleteDoubleLinkElements(3,tail);
doubleLinkList.PrintDoubleLinkList(tail);
}
}
输出
--------尾插法创建双链表--------
顺序输出链表:3 3 3 1 3 4 3 3 3 7 3 0 8 2 3 3 3
逆序输出链表:3 3 3 2 8 0 3 7 3 3 3 4 3 1 3 3 3 --------双链表反转--------
顺序输出链表:3 3 3 2 8 0 3 7 3 3 3 4 3 1 3 3 3
逆序输出链表:3 3 3 1 3 4 3 3 3 7 3 0 8 2 3 3 3
--------删除所有给定值--------
顺序输出链表:2 8 0 7 4 1
逆序输出链表:1 4 7 0 8 2