双向链表
数组优缺点:根据下标直接查找和修改,增删需要移动后续数据,效率低。
单向链表的缺点:增删快速,查找需要从头遍历,效率低。
双线链表可以向前或向后查找。
单向链表查找的方向只能是一个方向(双向链表可以向前向后查找),且不能自我删除,需要靠辅助节点,而双向链表,则可以自我删除,所以前面我们单链表删除节点时,总是找到temp的下一个节点来删除的(就是指temp.next.data == data,因为要对该节点的前一个节点及后一个节点操作。)
双向链表节点包含数据域data、前驱指针域prev、后继指针域next。
分析双向链表可以实现的功能:
(1)遍历:和单链表一样,只是可以向前向后查找。
(2)添加:举例添加node到链表的最后,rear.next = node;node.prev = rear;rear = node;
(3)修改:和单链表一样
(4)删除:举例删除node,node.prev.next = node.next;node.next.prev = node.prev;
代码实现:
// 定义双向链表 class DoublieLinkedList{ // 初始化一个头结点 private LinkedNode head = new LinkedNode(0,"",""); // 返回头结点 private LinkedNode getHead(){ return head; } // 遍历双向链表 public void show(){ // 按顺序遍历 // 先判断链表是否为空 if(head.next == null) System.out.println("链表为空"); // 因为头结点不能动,需要一个辅助变量来遍历 LinkedNode temp = head.next; while(temp != null){ // 链表不为空 System.out.println(temp.toString()); // 输出节点信息 temp = temp.next; // 指针后移 } } // 尾插法添加节点到单向链表 public void addRear(LinkedNode node){ // 遍历找到最后,找到尾结点 LinkedNode rear = head; while(head != null){ rear = head; head = head.next; } rear.next = node; node.prev = rear; } // 修改节点信息,根据编号修改。 /* 说明根据node的id来修改 */ public void update(LinkedNode node){ // 判断链表是否为空 if(head.next == null) System.out.println("链表为空"); // 找到需要修改的节点 // 定义一个辅助变量 LinkedNode temp = head; boolean flag = false; while(true){ if(temp.next == null)