手写单链表-并实现单链表元素逆置
来源:互联网 发布:电脑摄像头拍照软件 编辑:程序博客网 时间:2024/06/05 21:53
数组作为数据存储有一定的缺陷,在无序数组中,搜索是低效的;在有序数组中,插入效率低,不管在哪一种数组中,删除效率都很低,数组创建后它的大小是不可改变的。
链表:在内存中不是连续的,添加删除效率高,不支持高效随机访问
自己手写单链表 实现 链表元素逆制
元素逆制:
// 逆置 public void inverse1() { // 判断个数 如果size 是0 或者1 不需要逆置 if (size == 0 || size == 1) { return; } if (size == 2) { // 2个首尾逆置 Node<E> temp = first; first = last; last = temp; first.next = last; last.next = null; return; } else { // 如果大于2数 Node<E> node0 = null; Node<E> tempLast = null;// 尾部节点 int tempsize = size; for (int i = 0; i < tempsize; i++) { if (i == 0) { node0 = findNodeByIndex(0); remove(0); tempLast = node0; tempLast.next = null; } else { Node<E> node = findNodeByIndex(0); remove(0); node.next = node0; node0 = node; } } first = node0; last = tempLast; size = tempsize; } }
单链表实现:增删改查
public class SingleLinkedList<E> { private Node<E> first;// 首部节点 private Node<E> last;// 尾部节点 int size;// 容量大小 // 添加一个数据在数据链表 尾部 public boolean add(E e) { LinkedLast(e); return true; } // 在链最后端添加节点 private void LinkedLast(E e) { Node<E> data = new Node<E>(e, null); if (size == 0) { // 如果添加第一个 this.first = data; this.last = data; } else { // 依次往后添加 this.last.next = data; this.last = data;// 设置最后一个节点 } size++; } // 随机添加一个数据 public boolean add(int index, E e) { // 判断插入位置错误 if (index < 0 || index > size) { return false; } // 如果插入的位置是最后一个 if (index == size) { LinkedLast(e); return true; // 如果插入的位置是第一个 } else if (index == 0) { Node<E> data = new Node<E>(e, this.first); this.first = data; size++; return true; } else { // 插入位置为链表中间位置 // 第一步查找到要插入位置的数据 Node<E> fiNode = findNodeByIndex(index - 1); // 第二步 中间插入数据 Node<E> data = new Node<E>(e, fiNode.next); fiNode.next = data; size++; return true; } } // 查找指定位置的Node private Node<E> findNodeByIndex(int index) { if (index < 0 || index > size) { return null; } Node<E> target = this.first; for (int i = 0; i < index; i++) { target = target.next; } return target; }; // 删除随机数据 public boolean remove(int index) { if (index < 0 || index >= size) { return false; } if (index == 0) { // 当删除第一个数据时 first = first.next; size--; } else { // 获取删除node 的前一个节点 Node<E> pre = findNodeByIndex(index - 1); // 获取节点后一个节点 Node<E> target = pre.next; // 将前一个节点的next 指向下后一个节点 pre.next = target.next; // 删除当前节点 if (!target.hasNext()) { // 删除的就是最后一个节点 last = pre; } target = null; size--; } return true; } public E find(int index) { if (index < 0 || index > size) { return null; } return findNodeByIndex(index).item; } // 设置第一个first public void setFirst(E e) { add(0, e); } public void setLast(E e) { add(size, e); } boolean hasNext(Node node) { if (node.next != null) { return true; } return false; }; // 打印single Linked list 数据 优化查找 带来的多次循环 @Override public String toString() { Node<E> eNode = first; StringBuffer sbBuffer = new StringBuffer(); if (size == 0) { sbBuffer.append("没有数据"); } else { for (int i = 0; i < size; i++) { sbBuffer.append(i + "--->" + eNode.item + " \t"); if (eNode.hasNext()) { eNode = eNode.next; } } } // for (int i = 0; i < size; i++) { // System.out.print(i + "--->" + findNodeByIndex(i).item + " \t"); // } return sbBuffer.toString(); } // 逆置 public void inverse() { // 判断个数 如果size 是0 或者1 不需要逆置 if (size == 0 || size == 1) { return; } // 替换item for (int i = 0; i < size / 2; i++) { Node<E> node1 = findNodeByIndex(i); Node<E> node2 = findNodeByIndex(size - 1 - i); E e = node1.item; node1.item = node2.item; node2.item = e; } // } // 逆置 public void inverse1() { // 判断个数 如果size 是0 或者1 不需要逆置 if (size == 0 || size == 1) { return; } if (size == 2) { // 2个首尾逆置 Node<E> temp = first; first = last; last = temp; first.next = last; last.next = null; return; } else { // 如果大于2数 Node<E> node0 = null; Node<E> tempLast = null;// 尾部节点 int tempsize = size; for (int i = 0; i < tempsize; i++) { if (i == 0) { node0 = findNodeByIndex(0); remove(0); tempLast = node0; tempLast.next = null; } else { Node<E> node = findNodeByIndex(0); remove(0); node.next = node0; node0 = node; } } first = node0; last = tempLast; size = tempsize; } } private static class Node<E> { E item; Node<E> next; public Node(E e, Node<E> next) { this.item = e; this.next = next; } boolean hasNext() { if (next != null) { return true; } return false; }; }}
阅读全文
0 0
- 手写单链表-并实现单链表元素逆置
- 面试-链表逆置 作业手写一个单链表,并且实现单链表元素的逆置,(a0, a1,a2,a3,..an)-> (an,an-1,… a1, a0),算法的空间复杂度和时间复杂度经可能低
- GridView手写数据源并实现分页效果
- java 手写单链表。
- 手写CollectionView并调整布局
- SDUST-OJ-1681 Problem 求集合的交并补集(不用STL,手写单链表实现)
- 手写注册页面,并实现验证信息(AJAX,Jquery,正则表达式,密码强度验证)
- memcpy手写实现
- 手写实现AOP编程
- 手写代码实现EventBus
- 手写实现spring mvc
- 手写数字识别实现
- 手写代码实现EventBus
- 手写实现Tomcat服务器
- 手写实现HashMap代码
- bp实现手写识别
- 手写HashMap实现
- 手写实现二叉排序树
- python数据库操作SQLAlchemy
- 11-06-2017 java学习
- Spring 相关jar包的作用
- 20171106 排班
- https工作原理
- 手写单链表-并实现单链表元素逆置
- Makefile报错 *** missing separator. Stop.
- 【蓝桥杯】【逆波兰表达式】
- 差分约束 详解
- Highly Efficient Forward and Backward Propagation of Convolutional Neural Networks for Pixelwise Cla
- iOS开发 iPhone X适配
- C语言strtoul函数简介
- 两阶段事务
- 在linux中安装好java环境,终端可以启动eclipse 但是双击不可以