Java数据结构——双向链表


//=================================================
// File Name : DoublyLinked_demo
//------------------------------------------------------------------------------
// Author : Common //类名:DoublyLinkedList
//属性:
//方法:
class DoublyLinkedList{ //双向链表
private Link_long first;
private Link_long last; public DoublyLinkedList(){ //构造函数
this.first = null;
this.last = null;
} public boolean isEmpty(){
return first==null;
} public void insertFirst(long dd){ //从链表的头开始插入
Link_long newLink = new Link_long(dd);
if(isEmpty()){
last = newLink; //不用改变first
}else{
first.previous = newLink; //插入新的元素
}
newLink.next = first; //插入新的元素
first = newLink; //修改first的位置
} public void insertLast(long dd){ //从链表的尾开始插入
Link_long newLink = new Link_long(dd);
if(isEmpty()){
first = newLink; //不用改变last
}else{
last.next = newLink; //在last后面添加新元素,并修改last的位置
newLink.previous = last;
}
last = newLink; //注意:只有一个元素的时候,插入要把last也赋为newLink
} public Link_long deleteFirst(){ //从链表的头删除一个元素
Link_long temp = first; //暂存first
if(first.next == null){ //如果只有一个元素,把last也赋为null
last = null;
}else{
first.next.previous = null;
}
first = first.next; //把next设为first
return temp; //返回原来的first
} public Link_long deleteLast(){ //从链表的头删除一个元素
Link_long temp = last; //暂存last
if(first.next == null){ //如果只有一个元素,把first也赋为null
first = null;
}else{
last.previous.next = null;
}
last = last.previous; //把previous设为last
return temp; //返回原来的last
} public boolean insertAfter(long key,long dd){ //在特定元素后面插入
Link_long current = first;
while(current.dData != key){
current = current.next;
if(current == null){
return false;
}
}
Link_long newLink = new Link_long(dd); if(current == last){
newLink.next = null;
last = newLink;
}else{
newLink.next = current.next;
current.next.previous = newLink;
}
newLink.previous = current;
current.next = newLink;
return true;
} public Link_long deleteKey(long key){ //删除指定元素
Link_long current = first;
while(current.dData != key){
current = current.next;
if(current == null){
return null;
}
}
if(current == first){ //如果第一个元素匹配,则删除,并把first向后移动
first = current.next;
}else{
current.previous.next = current.next; //改变current上一个元素的next的指向
}
if(current == last){
last = current.previous; //如果最后一个元素匹配,则删除,并把previous向前移动
}else{
current.next.previous = current.previous; //改变current后一个元素的previous的指向
}
return current;
} public void displayForward(){
System.out.println("List(first-->last):");
Link_long current = first; //用于不断改变位置实现遍历
while(current != null){
current.displayLink();
current = current.next;
}
} public void displayBackward(){
System.out.println("List(last-->first):");
Link_long current = last; //用于不断改变位置实现遍历
while(current != null){
current.displayLink();
current = current.previous;
}
} } //主类
//Function : DoublyLinked_demo
public class DoublyLinked_demo { public static void main(String[] args) {
// TODO 自动生成的方法存根
DoublyLinkedList theList = new DoublyLinkedList(); theList.insertFirst(40);
theList.insertFirst(30);
theList.insertFirst(20);
theList.insertFirst(10);
theList.displayForward();
theList.displayBackward(); theList.insertAfter(20, 25);
theList.displayForward();
theList.displayBackward(); theList.deleteFirst();
theList.displayForward(); theList.deleteKey(20);
theList.displayForward();
} }


Java数据结构——双向链表的更多相关文章
- Java数据结构--双向链表的实现
#java学习经验总结------双向链表的实现 双向链表的建立与单链表类似,只是需要使用pre指针指向前一个结点,并且在删除添加时不仅仅考虑next package datastructure; p ...
- Java数据结构之线性表
从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...
- Java数据结构和算法 - 链表
Q: 为什么要引入链表的概念?它是解决什么问题的? A: 数组作为数据存储结构有一定的缺陷,在无序数组中,搜索是低效的:而在有序数组中,插入效率又很低:不管在哪一个数组中删除效率都很低:况且一个数组创 ...
- (6)Java数据结构-- 转:JAVA常用数据结构及原理分析
JAVA常用数据结构及原理分析 http://www.2cto.com/kf/201506/412305.html 前不久面试官让我说一下怎么理解java数据结构框架,之前也看过部分源码,balab ...
- Java简单双向链表实现 @version 1.0
package com.list; /** * 数据结构和算法Java表示 双向链表 * * @version 1.0 * @author 小明 * */ public class MyDoublel ...
- Java数据结构和算法(一)线性结构
Java数据结构和算法(一)线性结构 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 线性表 是一种逻辑结构,相同数据类型的 ...
- 一文掌握关于Java数据结构所有知识点(欢迎一起完善)
在我们学习Java的时候,很多人会面临我不知道继续学什么或者面试会问什么的尴尬情况(我本人之前就很迷茫).所以,我决定通过这个开源平台来帮助一些有需要的人,通过下面的内容,你会掌握系统的Java学习以 ...
- Java数据结构和算法(四)--链表
日常开发中,数组和集合使用的很多,而数组的无序插入和删除效率都是偏低的,这点在学习ArrayList源码的时候就知道了,因为需要把要 插入索引后面的所以元素全部后移一位. 而本文会详细讲解链表,可以解 ...
- Java数据结构之队列的实现以及队列的应用之----简单生产者消费者应用
Java数据结构之---Queue队列 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在 ...
随机推荐
- oracle如何获取每个月的最后一天
SELECT LAST_DAY(DATE'2016-09-23') FROM DUAL;
- LINUX下PHP开启短标签short_open_tag支持
LINUX下PHP开启短标签short_open_tag支持 以CENTOS为例: 找到php.ini #find / -name php.ini #/etc/php.ini 编辑php.ini #v ...
- C#.NET里面抽象类和接口有什么区别?
声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况.不能创建abstract 类的实例.然 ...
- asp.net mvc 多级目录结构
ikmb@163.com ASP.NET MVC默认的文件组织和URL访问都是一级,我们通常要将一个功能模块组织到一个目录下.方法是:1.文件组织 分别在Controllers和Views文件夹下建议 ...
- 10G整数文件中寻找中位数或者第K大数
来源:http://hxraid.iteye.com/blog/649831 题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数.内存限制为 2G.只写出思路即可(内存限制为 2G的意思就 ...
- gym923B
Even though he isn't a student of computer science, Por Costel the pig has started to study Graph Th ...
- Mysql-windows下修改密码
忘记密码修改(以下各种方法视情况而使用,本人测试,有些都是案情况才可行,但都是有设置成功过) 注:修改密码成功后一定要记得刷新下权限(否则将导致不能使用当前用户连接) mysql>FLUSH P ...
- HTTP协议学习---(十)拓展-HTTPS协议
HTTPS(Hypertext Transfer Protocol over Secure Socket Layer,基于SSL的HTTP协议)使用了HTTP协议,但HTTPS使用不同于HTTP协议的 ...
- Servlet 工作原理解析
转自:http://www.ibm.com/developerworks/cn/java/j-lo-servlet/ Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 J ...
- 【BZOJ-1060】时态同步 树形DP (DFS爆搜)
1060: [ZJOI2007]时态同步 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2101 Solved: 595[Submit][Statu ...