8、双向链表
我们知道单向链表只能从一个方向遍历,那么双向链表它可以从两个方向遍历。
具体代码实现:
1 package com.ys.datastructure; 2 3 public class TwoWayLinkedList { 4 private Node head;//表示链表头 5 private Node tail;//表示链表尾 6 private int size;//表示链表的节点个数 7 8 private class Node{ 9 private Object data; 10 private Node next; 11 private Node prev; 12 13 public Node(Object data){ 14 this.data = data; 15 } 16 } 17 18 public TwoWayLinkedList(){ 19 size = 0; 20 head = null; 21 tail = null; 22 } 23 24 //在链表头增加节点 25 public void addHead(Object value){ 26 Node newNode = new Node(value); 27 if(size == 0){ 28 head = newNode; 29 tail = newNode; 30 size++; 31 }else{ 32 head.prev = newNode; 33 newNode.next = head; 34 head = newNode; 35 size++; 36 } 37 } 38 39 //在链表尾增加节点 40 public void addTail(Object value){ 41 Node newNode = new Node(value); 42 if(size == 0){ 43 head = newNode; 44 tail = newNode; 45 size++; 46 }else{ 47 newNode.prev = tail; 48 tail.next = newNode; 49 tail = newNode; 50 size++; 51 } 52 } 53 54 //删除链表头 55 public Node deleteHead(){ 56 Node temp = head; 57 if(size != 0){ 58 head = head.next; 59 head.prev = null; 60 size--; 61 } 62 return temp; 63 } 64 65 //删除链表尾 66 public Node deleteTail(){ 67 Node temp = tail; 68 if(size != 0){ 69 tail = tail.prev; 70 tail.next = null; 71 size--; 72 } 73 return temp; 74 } 75 76 //获得链表的节点个数 77 public int getSize(){ 78 return size; 79 } 80 //判断链表是否为空 81 public boolean isEmpty(){ 82 return (size == 0); 83 } 84 85 //显示节点信息 86 public void display(){ 87 if(size >0){ 88 Node node = head; 89 int tempSize = size; 90 if(tempSize == 1){//当前链表只有一个节点 91 System.out.println("["+node.data+"]"); 92 return; 93 } 94 while(tempSize>0){ 95 if(node.equals(head)){ 96 System.out.print("["+node.data+"->"); 97 }else if(node.next == null){ 98 System.out.print(node.data+"]"); 99 }else{ 100 System.out.print(node.data+"->"); 101 } 102 node = node.next; 103 tempSize--; 104 } 105 System.out.println(); 106 }else{//如果链表一个节点都没有,直接打印[] 107 System.out.println("[]"); 108 } 109 110 } 111 }