Java数据结构——双向链表
1.双向链表
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。
class DBNode{ int data;//存放的数据 DBNode next;//下一个结点 DBNode pre;//前一个结点 public DBNode(int data) { this.data = data; } }2.链表的常见操作(遍历,添加,修改,删除)
- 遍历 和单链表一样,只是可以向前,也可以向后
- 添加(默认添加到双向链表的最后)
- 先找到双向链表的最后结点
- temp.next = newHeroNode
- newHeroNode.pre = temp
- 因为是双向链表,可以实现自我删除
- 直接找到要删除的这个结点,比如temp
- temp.pre.next = temp.next;
- temp.next.pre = temp.pre
package org.learn.link; public class DoubleLink { public static void main(String[] args) { // TODO Auto-generated method stub DBlinkList mylist = new DBlinkList(); mylist.addDBNode(1); mylist.addDBNode(2); mylist.addDBNode(3); mylist.addDBNode(4); System.out.println("双向链表:"); mylist.print(); System.out.println("删除后的双向链表:"); mylist.delete(3); mylist.print(); } } class DBlinkList{ //头节点 DBNode head = new DBNode(0); //添加结点到双向链表(尾部添加) public void addDBNode(int data) { DBNode newNode = new DBNode(data); DBNode cur = head; while(cur.next != null) cur = cur.next; cur.next = newNode; newNode.pre = cur; } //删除结点 public void delete(int data) { if(head.next == null) { System.out.println("链表为空。"); return; } DBNode cur = head.next; boolean flag = false;//标志是否找到待删除结点 while(true) { if(cur == null) break;//已经遍历完这个链表 if(cur.data == data) { flag = true; break; } cur = cur.next;//后移 } if(flag) { cur.pre.next = cur.next; if(cur.next != null) cur.next.pre = cur.pre; }else System.out.printf("要删除的结点数据为%d不存在\n",data); } //显示结点 public void print() { DBNode cur = head.next; while(cur !=null) { System.out.print(cur.data+" "); cur = cur.next; } System.out.println(); } } class DBNode{ int data; DBNode next;//下一个结点 DBNode pre;//前一个结点 public DBNode(int data) { this.data = data; } }
(Ps:该篇整理在学习尚硅谷的数据结构视频后,所以,里面大部分内容都是借鉴视频内容,只是单纯记录整理,帮助自己复习回顾)