双向列表增删改

单向链表只能从一个方向遍历链表,即只能查找结点的下一个结点(后继结点),而不能查找结点的上一个结点(前驱结点)。鉴于上述问题,引入了双向链表。由于双向循环链表包含双向链表的所有功能操作。因此,我们只讲述双向循环链表。

与单向链表不同,双向链表的结点构造如下图所示。即一个结点由三个部分组成,数据域DATA,左指针域pre和右指针域next。其中,数据域用来存放结点数据信息,左指针域用来指向前驱结点,右指针域用来指向后继结点。

代码如下:

package com.qdcz.breadth.demo;

/**
*
* <p>Title: TwoLinke</p>
* <p>Description: 双向链表实现类</br>
* <a href="http://blog.csdn.net/basycia/article/details/51839221">详情资料</a>
* </p>
* <p>Company: 奇点创智</p>
* <p>Version: 1.0</p>
* @author Administrator
* @date 2017年6月6日 下午1:47:31
*/
public class TwoLinke {
public static void main(String[] args) {
QuNo node=new QuNo();
node.add("aaa");
node.add("ddd");
node.add("ccc");
System.out.println(node);
node.addFirst("BBB");
System.out.println(node);
node.addLast("AAA");
System.out.println(node);
node.add("DDD", 4);
System.out.println(node);
node.removeFirst();
System.out.println(node);
node.removeLast();
System.out.println(node);
node.remove(3);
System.out.println(node);
System.out.println(node.get(2));

}
}
class QuNo{
private static class Node1{
Object value;
Node1 prev=this;
Node1 next=this;
public Node1(Object value) {
super();
this.value = value;
}
@Override
public String toString() {
return "Node1 [value=" + value + "]";
}
}

private Node1 head=new Node1(null);
private int size;
public boolean addFirst(Object o){
addAfter(new Node1(o),head);
return true;
}
public boolean addLast(Object o){
addBefore(new Node1(o),head);
return true;

}
public boolean add(Object o){
return addLast(o);
}
public boolean add(Object o,int index){
addBefore(new Node1(o),getNode1(index));
return true;
}
public boolean remove(int index){
removeNode1(getNode1(index));
return true;
}
public boolean removeFirst(){
removeNode1(head.next);
return true;
}
public boolean removeLast(){
removeNode1(head.prev);
return true;
}
public Object get(int index){
return getNode1(index).value;
}
public int size(){
return size;
}
public String toString(){
StringBuffer sb=new StringBuffer("[");
Node1 node1=head;
for (int i = 0; i <size; i++) {
node1=node1.next;
if(i>0)sb.append(",");
sb.append(node1.value);
}
sb.append("]");
return sb.toString();
}
private void removeNode1(Node1 node1) {
node1.prev.next=node1.next;
node1.next.prev=node1.prev;
node1.prev=null;
node1.next=null;
size++;
}
private Node1 getNode1(int index) {
if(index<0||index>=size)throw new IndexOutOfBoundsException();
Node1 node=head.next;
for (int i = 0; i <index; i++) {
node=node.next;
}
return node;
}
private void addBefore(Node1 node1, Node1 head2) {
node1.next=head2;
node1.prev=head2.prev;
node1.next.prev=node1;
node1.prev.next=node1;
size++;
}
private void addAfter(Node1 node1, Node1 head2) {
node1.prev=head2;
node1.next=head2.next;
node1.prev.next=node1;
node1.next.prev=node1;
size++;
}

}

时间: 2024-10-13 02:21:34

双向列表增删改的相关文章

week_one-python基础 列表 增删改查

# Author:larlly'''#列表增删改查#定义列表name = ["wo","ni","ta","wo"] #定义列表num_list = list(range(1,10)) #range生成范围的数,强制转化为列表#查print(num_list)print(name[0])print(name[0:2]) #顾头不顾尾print(name[-1])print(name[:]) #取所有值print(name[-3

python3-list列表增删改查合并排序

# Auther: Aaron Fan names = ["aaron", "alex", "james", "meihengfan"]names2 = [1,2,3,4,5]print(names) #查#print(names) #列出列表的内容print(names[3]) #访问列表中第4个值print(names[1:3]) #访问列表中从第2个到第3个的值print(names[-1]) #访问列表中的最后一个值p

Vue电商后台管理系统项目第3篇-首页用户列表增删改查功能

前言 由于之前的作者没有再更新这个后台管理系统项目的文章了,我想着把它的项目重头到位做一遍,把剩下的文章写完,把这个项目记录完整,以后遇到类似的后台管理系统项目,可以快速复习一些知识点. 新的项目地址:https://github.com/C4az6/vue_manage_system 添加用户 这个操作在用户列表页面,所以路由不用再进行 处理了. 基于单文件组件: 添加事件绑定--弹出新增用户对话框 添加dialog对话框 Element-UI组件>dialog对话框>自定义内容>表单

列表增删改查

1,列表中添加一个元素 >>> name= ["jim","tom","luch","jon","jia"] >>> name.append("key") >>> name['jim', 'tom', 'luch', 'jon', 'jia', 'key'] 2,列表中查找元素的索引 >>> name ['jim',

ASP.NET菜鸟之路之实现新闻列表增删改

背景 我是一个ASP.NET菜鸟,暂时开始学习ASP.NET,在此记录下我个人敲的代码,没有多少参考价值,请看到的盆友们为我点个赞支持我一下,多谢了. 网站介绍 根据视频的例子修改的方法,其中数据不经过数据库,而是通过static属性保存一个唯一的列表当作数据源,以简化操作.. 这个网站包含显示.增加.删除.修改四个功能. 效果介绍 知识点包括div+css搭建框架,用JQuery给按钮注册事件,iframe标签的使用方法,在前台用C#的foreach循环绑定数据功能,给删除功能注册是否确认事件

Vue电商后台管理系统项目第5篇-角色列表的增删改查&amp;&amp;角色授权

角色列表的增删改查 1.添加角色 先根据API文档编写接口: // 添加角色 export const addRolesApi = (data) => { return axios({ method: 'post', url: 'roles', data }) } 在角色组件内引用,然后给 添加角色 按钮绑定一个点击事件addRolesClick: <!-- 添加角色 --> <el-button type="success" plain @click=&quo

【黑马Android】(04)数据库的创建和sql语句增删改查/LinearLayout展示列表数据/ListView的使用和BaseAdater/内容提供者创建

数据库的创建和sql语句增删改查 1. 加载驱动. 2. 连接数据库. 3. 操作数据库. 创建表: create table person( _id integer primary key, name varchar(20), age integer ); 添加: insert into person(name, age) values('lisi', 19); 删除: delete from person where _id = 1; 修改: update person set name =

Python列表的增删改查排

Python列表的增删改查排 一.列表的样子: a = ['q' , 'w' , 'e ', 'r','t'] a为列表名,[ ]为列表内容,' '为列表内的元素,'q'为a[0] 二.查(也称切片): print ( a[0] )          #取出列表中第一个元素 即:q print ( a[1:] )        #从第二个元素开始取到最后 即:['w', 'e','r', 't'] print ( a[1:3] )        #取出从第二个开始到第三个元素 即:['w','e

EF(Entity Framework)通用DBHelper通用类,增删改查以及列表

(1)通用类用法 其中 通用类名:DBhelper 实体类:UserInfo 1 //新增 2 DBHelper<UserInfo> dbhelper = new DBHelper<UserInfo>(); 3 UserInfo userinfo = new UserInfo(); 4 userinfo.Name = "1"; 5 dbhelper.Add(userinfo); 6 7 //根据条件查找列表 8 var entityes = dbhelper.F