跟小刀学 数据结构 双向链表
来源:互联网 发布:淘宝店铺关注怎么刷 编辑:程序博客网 时间:2024/04/30 13:58
- 今天就是五一了。有女朋友得都出去浪去了。然而像我这单身屌丝。只能在家撸代码。真是代码虐我千百遍,我对代码如初恋。一天就是10个小时的学习开始了。
- 今天我们学习双向链表用java实现。因为以前学习数据结构的没用功,以至于现在学了一早上也仅仅理解了一些。
- 什么是双向链表呢?
- 每一个结点除了保存对下一个结点的的引用,同时还保存对前一个结点的引用
- 从头部进行插入
- 要对链表进行判断
- 要对链表进行判断,如果为空的话就设置尾结点为新添加的结点,如果不为空,还需要设置头结点的前一个结点为新添加的结点。
- 从尾部插入
- 如果链表为空,直接设置头结点为新添加的结点。否则设置尾结点的后一个结点为添加的结点。同时设置添加的结点的前一个的引用
数据结构如下图:
废话不多说话了直接上代码
先创建一个结点类
/** * 双向链表需要的节点 * @author Administrator * */public class Link { public long data; //指针域 public Link next; //指针域 public Link provious; public Link(long dd){ data = dd; } public void display(){ System.out.print(data+" "); }}
在创建双向链表的实现
public class DoublyLink { //头节点 private Link first; //尾节点 private Link last; public DoublyLink(){ first = null; last = null; } /** * 从头节点开始添加 * @param d */ public void insertFirst(long d){ Link newlink = new Link(d); if(isEmpty()){ last = newlink;//如果为空话。last = 新添加的节点 }else{ first.provious = newlink;//第一个的前一指针指向先节点 } newlink.next =first;//新节点的next指向 原来的第一个 first =newlink;//第一个变成新的 } public void insertLast(long d){ Link newlink = new Link(d); if(isEmpty()){ first = newlink; }else{ last.next=newlink; newlink.provious=last; } last = newlink; } public Link deleteFirst(){ Link temp = first; if(first.next == null){ last = null; }else{ first.next.provious =null; } first = first.next; return temp; } public Link deleteLast(){ Link temp = last; if(last.provious ==null){ first = null; }else{ //清楚前一个的引用 last.provious.next=null; } last =last.provious; return temp; } public boolean insertAfter(long key,long data){ Link newLink = new Link(data); Link current =first; while(current.data !=key){ current= current.next; if(current ==null){ return false; } } if(current == last){ newLink.next=null; last = newLink; }else{ //设置newLink 的前后的指针 newLink.next =current.next; current.next.provious =newLink;//设置要添加的节点的下一个的前一个的指针域 } newLink.provious = current; current.next= newLink; return true; } public Link deletekey(long key){ Link current = first; while(current.data != key){ current = current.next; if(current == null){ return null; } } //1,先处理next 的引用 if(current == first){ //删除第一个节点。 first =first.next; }else{ //如果不是第一个就删除前一个节点的next 引用 current.provious.next = current.next; } // 在处理provious 的引用 if(current == last){//如果是最后一个的话,就删除最后一个 last =current.provious; }else{ //[1][2][3] 当前的下一个的provious 指向要删除的这个节点的prov current.next.provious = current.provious; } return current; } public void displayForward(){ System.out.print("first--->last:"); Link current = first; while(current!=null){ current.display(); current = current.next; } System.out.println(); } public void displayBackward(){ System.out.print("last--->first:"); Link current = last; while(current!=null){ current.display(); current = current.provious; } System.out.println(); } public boolean isEmpty(){ return first == null; }}
在创建测试类:
public static void main(String[] args) { DoublyLink d = new DoublyLink(); d.insertFirst(20); d.insertFirst(40); d.insertFirst(60); d.insertLast(11); d.insertLast(33); d.insertLast(55); d.displayForward(); d.displayBackward(); d.deleteFirst(); d.deleteLast(); d.displayForward(); d.deletekey(11); d.displayForward(); d.insertAfter(20, 25); d.insertAfter(33, 77); d.displayForward(); d.deletekey(40); d.displayForward(); }
测试结果如下:
first--->last:60 40 20 11 33 55 last--->first:55 33 11 20 40 60 first--->last:40 20 11 33 first--->last:40 20 33 first--->last:40 20 25 33 77 first--->last:20 25 33 77
对双向链表学的不好的同学。写起来可能比较费劲。我也是一边画图,一边理解。现在记下来以便以后加强记忆。
0 0
- 跟小刀学 数据结构 双向链表
- 跟小刀 学有序链表的实现
- 跟小刀学习 java 数据结构 单向链表
- 跟小刀 学习数据结构 红黑树的概念
- 跟小刀学习 java 数据结构 栈和队列的实现
- 跟小刀学习 数据结构二叉树的实现
- 一步一步学数据结构之1--1(双向链表)
- 跟我学数据结构:(3)单向链表
- 跟我学数据结构:(3)单向链表
- 跟我学数据结构:(3)单向链表
- 跟我学数据结构之线性表
- 数据结构--双向链表
- 数据结构-双向链表
- 数据结构-----双向链表
- 数据结构-双向链表
- 【数据结构】双向链表
- 双向链表 - 数据结构
- 数据结构--双向链表
- HashMap源码分析
- 链表3:反转链表
- 初始ajax和跨域
- 树状数组 or 归并树 —— HDU 4417
- C# 人脸识别
- 跟小刀学 数据结构 双向链表
- RabbitMQ,ActiveMq,ZeroMq比较
- reactnative Navigator api解释
- HDU3709
- PL2303在win10无法使用的解决办法
- 消息队列比较以及通信问题
- tomcat源码浅析--connector
- 使用jdbc连接数据库的简单案例
- ZOJ-3331-双塔dp