JAVA基础——链表结构之双端链表

双端链表:双端链表与传统链表非常相似.只是新增了一个属性-即对最后一个链结点的引用 如上图所示:由于有着对最后一个链结点的直接引用.所以双端链表比传统链表在某些方面要方便.比如在尾部插入一个链结点.双端链表可以进行直接操作 但传统链表只能通过next节点循环找到最后链结点操作.所以双端链表适合制造队列. 下面的双端链表类.有几个重要方法. insertFirst(插入首链结点) 这个方法与上篇博文的单链表是基本一样的.唯一区别就是,多了个last引用的操作.正常由于last是指向尾链结点的引用,所以插入首链结点是与他无关的. 但当链结点为空(isEmpty())的时候,这会追加的链结点既是首链结点又是尾链结.所以需要将last指向它.

public void insertFirst(double dd) {     Link newLink = new Link(dd);     if(isEmpty()){         last = newLink;     }     newLink.next = first;     first = newLink;     }

insertLast(插入尾链结点) 插入尾部链结点也是与普通的理解基本一致,所以不多赘述.唯一也要注意的是链结点为空(isEmpty())的时候.需要将first指向该链结点.

public void insertLast(double dd) {     Link newLink = new Link(dd);     if(isEmpty()) {         first = newLink;     }else {         last.next = newLink;     }     last = newLink; }

看下插入尾部链结点的引用指向: deleteFirst(删除首部链结点) 这个需要注意的就是,如果仅剩下一个链结点.那么删除后last就应该指向null了.

public void deleteFirst() {     first = first.next;     if(first.next == null) {         last = null;     }     }

最后这个代码如下:

FirstLastLink package com.dbstructor.oop3;
// 链结点类 class Link {     public double dData;     public Link next;     public Link(double dd) {         dData = dd;     }     public void displayLink() {         System.out.print(dData + " ");     } } // 双端链表类 class FirstLastList {     public Link first;     public Link last;     public FirstLastList() {         first = null;         last = null;     }     public boolean isEmpty(){         return (first == null);     }     // 表头插入     public void insertFirst(double dd) {         Link newLink = new Link(dd);         if(isEmpty()){             last = newLink;         }         newLink.next = first;         first = newLink;         }     // 表尾插入     public void insertLast(double dd) {         Link newLink = new Link(dd);         if(isEmpty()) {             first = newLink;         }else {             last.next = newLink;         }         last = newLink;     }     // 删除表头     public void deleteFirst() {         first = first.next;         if(first.next == null) {             last = null;         }         }          public void displayList() {         System.out.print("List (first--->last)");         Link current = first;         while(current != null){             current.displayLink();             current = current.next;         }         System.out.println();     } } public class FirstLastApp {     public static void main(String[] args) {         FirstLastList theList = new FirstLastList();         // 插入链表头数据         theList.insertFirst(22);         theList.insertFirst(44);         theList.insertFirst(66);         // 插入链表尾数据         theList.insertLast(11);         theList.insertLast(33);         theList.insertLast(55);                  theList.displayList();         // 删除表头数据         theList.deleteFirst();         theList.deleteFirst();                  theList.displayList();     }
}

代码运行结果为:

List (first--->last)66.0 44.0 22.0 11.0 33.0 55.0  List (first--->last)22.0 11.0 33.0 55.0

链表的效率 这里顺便谈下链表和数组相比效率的优越性.在表头插入和删除的速度都很快,因为只需要改变一下引用所以花费O(1)的时间. 平均起来查找,删除和在指定节点后插入数据都需要搜索一半的链结点.需要O(N)次比较和数组一样.然由于链表删除插入的时候 不需要像数组那种元素的移动.所以效率还是要优于数组. 还有一点就是链表的内存可以随时的扩展内存.而数组的内存是一开始就固定好的.这样就会导致数组的效率和可用性大大下降.

原文地址:https://www.cnblogs.com/huan-guo/p/8485266.html

时间: 2024-10-10 08:09:01

JAVA基础——链表结构之双端链表的相关文章

双端链表

双端链表 链表作为数组之外的一种常用序列抽象, 是大多数高级语言的基本数据类型, 因为 C 语言本身不支持链表类型, 大部分 C 程序都会自己实现一种链表类型, Redis 也不例外 —— 实现了一个双端链表结构. 双端链表作为一种常见的数据结构, 在大部分的数据结构或者算法书里都有讲解, 因此, 这一章关注的是 Redis 双端链表的具体实现, 以及该实现的 API , 而对于双端链表本身, 以及双端链表所对应的算法, 则不做任何解释. 读者如果有需要的话,可以参考维基百科的双端链表词条,里面

Java单链表、双端链表、有序链表实现

Java单链表.双端链表.有序链表实现 原创 2014年03月31日 23:45:35 标签: Java / 单链表 / 双端链表 / 有序链表 65040 单链表: insertFirst:在表头插入一个新的链接点,时间复杂度为O(1) deleteFirst:删除表头的链接点,时间复杂度为O(1) 有了这两个方法,就可以用单链表来实现一个栈了,见http://blog.csdn.net/a19881029/article/details/22579759 find:查找包含指定关键字的链接点

Java数据结构——用双端链表实现队列

//================================================= // File Name : LinkQueue_demo //------------------------------------------------------------------------------ // Author : Common //类名:FirstLastList //属性: //方法: class FirstLastList_long{ private Lin

《Java数据结构与算法》笔记-CH5-链表-5用双端链表实现队列

1 //用双端链表实现队列 2 /** 3 * 节点类 4 */ 5 class LinkQ { 6 private long data; 7 public LinkQ next; 8 9 public LinkQ(long d) { 10 this.data = d; 11 } 12 13 public String toString() { 14 return String.valueOf(this.data); 15 } 16 } 17 /** 18 * 双端链表类 19 */ 20 cl

Java 模拟双端链表

双端链表: 双端链表与传统链表非常相似.只是新增了一个属性-即对最后一个链结点的引用rear 这样在链尾插入会变得非常容易,只需改变rear的next为新增的结点即可,而不需要循环搜索到最后一个节点 所以有insertFirst.insertLast 删除链头时,只需要改变引用指向即可:删除链尾时,需要将倒数第二个结点的next置空, 而没有一个引用是指向它的,所以还是需要循环来读取操作 /** * 双端链表 * @author stone */ public class TwoEndpoint

Redis源码-数据结构之Adlist双端链表

Redis的Adlist实现了数据结构中的双端链表,整个结构如下: 链表节点定义: typedef struct listNode { struct listNode *prev; struct listNode *next; void *value; } listNode; 链表定义: typedef struct list { listNode *head; listNode *tail; void *(*dup)(void *ptr); void (*free)(void *ptr); i

研磨数据结构与算法-02双端链表与双向链表

Node节点: /* * 链结点,相当于是车厢 */ public class Node { //数据域 public long data; //指针域 public Node next; public Node previous; public Node(long value) { this.data = value; } /** * 显示方法 */ public void display() { System.out.print(data + " "); } } 双端链表: /*

双端链表再次实现

package ch05; /** * 1:什么是双端链表. * 链表中保存着对最后一个链结点引用的链表 * 2:从头部进行插入 * 要对链表进行判断,如果为空则设置尾结点为新添加的结点 * 3:从尾部进行插入 * 如果链表为空,则直接设置头结点为新添加的结点 * 否则设置尾结点的后一个结点为新添加的结点 * 4:从头部进行删除 * 判断头结点是否有下一个结点,如果没有 * 则直接设置结点为null. * * */ public class FirstLastLinkList { //头结点 p

Data Handler 大模拟 + 双端链表 hdu 4268

E - Data Handler Time Limit:10000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description You are in charge of data in a company, so you are called "Data Handler". Different from the data in computer, the data