链表与双向链表
来源:互联网 发布:淘宝店铺转让骗局 编辑:程序博客网 时间:2024/05/16 06:17
链表与双向链表
一、特点
1)数组列表
缺点 :添加很慢
优点:查询快、元素是整块出现的
大小是可变的
可以删除
2)链表:
优点:添加很快 删除
缺点:查询慢、元素是零散出现的数组列表
链表是一个一个的结点相连接,需要定义结点,是链式的数据结构。
二、链表实现
1)定义一个结点
public class Node {
public Object data;//节点数据
public Node next;//下一个节点
}
2)测试功能
public class test {
private int size=6;
// 初始化6个节点
public Node createlink() {Node root = new Node();String s0 = "a";Object o = (String) s0;root.data = o; Node next1 = new Node();String s1 = "b";Object o1 = (String) s1;next1.data = o1; Node next2 = new Node();String s2 = "c";Object o2 = (String) s2;next2.data = o2; Node next3 = new Node();String s3 = "d";Object o3 = (String) s3;next3.data = o3; Node next4 = new Node();String s4 = "e";Object o4 = (String) s4;next4.data = o4; Node next5 = new Node();String s5 = "f";Object o5 = (String) s5;next5.data = o5;
//建立各结点之间的链接关系root.next = next1;next1.next = next2;next2.next = next3;next3.next = next4;next4.next = next5; return root;} de();root.next = add_node;add_node.data = data;size++;}
// 在末尾增加一个节点的数据public void add(Node root, Object data) {while (null != root.next) {root = root.next;}Node add_node = new No
// 在指定位置增加一个节点
public boolean add(Node root, Object data, int index) {if (index < 0 || index > size) {return false;} for (int i = 1; i < index - 1; i++) {root = root.next; }Node tmp = root.next;Node add_node1 = new Node();root.next = add_node1;add_node1.data = data; add_node1.next = tmp;size++;return true;}
// 遍历输出链表
public Node println(Node root) {int i = 1;while (null != root) {Object data = root.data;root = root.next;System.out.println("第" + i + "个节点是" + data);i++; }return root;}
// 删除指定位置的数据
public Object delete(Node root, int index) {if (index == 1) {root = root.next;return root;} else {Node temp = root;for (int i = 1; i < index - 1; i++) {root = root.next;}root.next = root.next.next;return temp.data;} }
// 主函数
public static void main(String[] args) {test te = new test();Node root = te.createlink();te.println(root);System.out.println(" ");root.data = te.delete(root, 3);te.println(root);System.out.println(" "); te.add(root, "hello");te.println(root);System.out.println(" "); te.add(root, "world", 4);te.println(root);}}
三、运行结果
四。双向链表的实现
1.定义节点
public class Double_Node<E> {Double_Node<E> next;Double_Node<E> last;public E data;public Double_Node(E e) {data = e;}}
2.功能实现
public class Double_Link<E> implements MyArrayList<E> {private Double_Node<E> head;private Double_Node<E> tail;private int size = 0;
// 末尾增加一个节点public void add(E e) {Double_Node<E> newnode = new Double_Node<E>(e);if (size == 0) {head = newnode;tail = newnode;} else {newnode.last=tail;tail.next = newnode;tail = newnode;}size++;}
//指定位置增加节点public boolean add(int index, E e) {Double_Node<E> newnode = new Double_Node<E>(e);
// 临时节点Double_Node<E> tmpNode = head;if (index < 0 || index > size)return false;else {if (index == 1) {head.last = newnode;newnode.next = head;head = newnode;} else {tmpNode = getNode(tmpNode, index - 1);newnode.last = tmpNode.last;newnode.next = tmpNode;tmpNode.last.next = newnode;tmpNode.last = newnode;}
// 长度size++;return true;}}
//删除某个节点public boolean remove( int index) {Double_Node<E> tmpNode = head;if (size == 0 || index > size) // 对外界操作进行限定return false;else {if (index == 1) {head = head.next;} else {// 1、找到这个位置的节点tmpNode = getNode(tmpNode, index - 1);// 2、更改上一个节点的后指针tmpNode.last.next = tmpNode.next;// 3、更改下一个节点的前指针tmpNode.next.last = tmpNode.last;}size--;return true;} }
//更新某个节点的数据public boolean update(int index, E newE) {Double_Node<E> tmpNode = head;if (size == 0 || index > size) // 对外界操作进行限定return false;else {// 1、找到这个位置的节点tmpNode = getNode(tmpNode, index - 1); // 2、改变此位置节点值tmpNode.data = newE;return true;}}
//获取各结点的数据public E get(int index) {// 新建一个节点,等于头节点Double_Node<E> node = head;for (int i = 0; i < index; i++) {// 往后移动一个node = node.next;} return node.data;}//获取链表长度public int size() {return size;}//获取链表数据public Double_Node<E> getNode(Double_Node head, int index) {// 新建一个节点,等于头节点Double_Node<E> node = head;for (int i = 0; i < index; i++) {// 往后移动一个node = node.next;}return node;}}
3.主函数调用
public class Manager {public static void main(String[] args) {Double_Link<String> newNode = new Double_Link<String>();newNode.add("a");newNode.add("b");newNode.add("c");newNode.add("d");newNode.add("e");newNode.add("f");newNode.add("g"); for(int i=0;i<newNode.size();i++){ System.out.println( newNode.get(i));} newNode.remove(1); for(int i=0;i<newNode.size();i++){ System.out.println( newNode.get(i));} newNode.update(1, "改变节点");newNode.add(1,"hhhh");for(int i=0;i<newNode.size();i++){System.out.println( newNode.get(i));}}}
运行结果
0 0
- 单链表与双向链表
- 循环链表与双向链表
- 循环链表与双向链表
- 链表与双向链表
- 循环链表与双向链表
- 双向链表与循环链表
- 二叉搜索树与双向链表
- 二叉搜素树与双向链表
- 双向链表插入与删除
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 双向链表的插入与删除
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- HSSF或这是POI到出excel表格
- Fiddler AutoResponder 用法
- yii2 createDirectory 文件上传的保存文件和递归创建文件夹
- Android SDK 在线更新配置(附镜像地址)
- 一般处理程序ashx的post请求
- 链表与双向链表
- 【九度OJ】: 1052
- 字符串压缩
- Android Studio常用插件整理
- git学习笔记
- window xampp 配置
- SIP电话(一)之程控交换机-FreeSWITCH的使用总结
- 对代码不满足,是任何真正有天才的程序员的根本特征
- GMS应用引起待机电流偏高问题