自定义链表增,删除,链表逆序
工作时间长了,经常用框架,感觉真的成了coding,建议有时间可以刷一下lettcode 时间一长就会忘,写了大半天,记录一下,理解后再写特别简单,链表逆序看了很多博客,写法各式各样,但是感觉解释的还是不清楚明了,所以在这又总结一下:
1.首先定义链表的结构
定义的结构Node<T> 这样data 可以自定义的泛型,增加了灵活性:
public class Node<T> {public T data;public Node next; //可以理解为C语言的指针public Node(){}public Node(T data){this.data = data;}public T getData() {return data;}public void setData(T data) {this.data = data;}public Node getNext() {return next;}public void setNext(Node next) {this.next = next;}
}
这里设计的 head 头指针数据默认为空也就是null;
执行 temp =p ,p=q 执行流程如下:
执行 tmp =p;p=q;q=q->next 其中q=q->next 是类C/C++写法进行解释;
这里容易忽视:p.next=null 容易形成回环:
q=q->next,在这里我理解为探针,查询是否已经到链表结尾了:
增删,逆序,具体代码如下:
import java.lang.reflect.Array;
import java.util.ArrayList;/*** @ClassName MyList* @Description* @Author qianxl* @Date 2019-09-07 17:34* @Version 1.0**/
public class MyList<T> {public Node head = new Node(-1);public Node current;/*** @param data* @description: 添加元素* @return: {@link Node}* @author qianxl* @date: 2019/9/7* @since 1.0*/public Node add(T data) {Node temp = head;Node before = new Node();do {before = temp;} while ((temp = temp.next) != null);
//注释部分是代码重构使用do while
// before = temp;
// while (temp != null) {
// before = temp;
// temp = temp.next;
// }temp = new Node(data);before.next = temp;return head;}public Node remove(T values) {Node data = this.head;boolean flag = false;Node before;Node temp = data.next;do {before = data;if (values.equals(temp.data)) {flag = true;break;}} while ((temp = temp.next) != null);
//注释部分是代码重构使用do while
// Node temp = data.next;
// Node before =data;
// while (temp != null) {
// if (values.equals(temp.data)) {
// flag = true;
// break;
// }
// before = temp;
// temp = temp.next;
// }if (flag) {before.next = temp.next;}return head;}/*** @param* @description: 计算集合的长度* @return: {@link int}* @author qianxl* @date: 2019/9/7* @since 1.0*/public int size() {Node data = head;int count = 0;Node tmp;while (data != null) {data = data.next;count++;}return count - 1;//head 不存入数据}/*** @param index* @param value* @description: 指定位置插入值* @return: {@link Node}* @author qianxl* @date: 2019/9/8* @since 1.0*/public Node insert(int index, T value) {Node data = head.next; //去掉头指针if (index > this.size() || index < 1) {return head;}if (index == 1) {Node node = new Node(value);node.next = head.next; //将新建的节点的指针指向,之前head 头结点指向的指针head.next = node;return head;}int count = 1;Node before = data; //do {if (index == count) {Node node = new Node(value);node.next = data;before.next = node; //指向新建的节点break;}count++;before = data;data = data.next;} while (data != null);
//注释部分是代码重构使用do while
// Node before =data;
// while (data != null) {
// if (index == count) {
// Node node = new Node(value);
// node.next=data;
// before.next=node; //指向新建的节点
// break;
// }
// count++;
// before = data;
// data = data.next;
// }return head;}/*** @param* @description: 链表逆序* @return: {@link Node}* @author qianxl* @date: 2019/9/8* @since 1.0*/public Node reverse() {Node p,q=null;p = head.next; //指针 引用q = head.next.next;//q 指针可以理解为探针,在探是否到达链表末尾了Node tmp=null;p.setNext(null); //防止回环while (q != null) {tmp =p;p=q;q=q.next; //q=q->next 起到探针的作用p.next=tmp;}head.next =p;return head;}public void print(Node node) {if (node.next == null) {return;}Node temp = node.next;while (temp != null) {System.out.print(temp.data+" ");temp = temp.next;}System.out.println();}/*** @param array* @description: 将数组转换为list head.next 理解为C语言指针,写链表操作一定要画图!* @return: {@link Node}* @author qianxl* @date: 2019/9/7* @since 1.0*/public Node arrayToList(T[] array) {Node data = head;for (int i = 0; i < array.length; i++) {Node node = new Node(array[i]);data.next = node; //表情指向前驱data = node; //表示}return head;}public static void main(String arg[]) {MyList<Object> list = new MyList<>();Node ddd = list.add("ddd");list.add("this is a list");list.add("fffff");list.remove("ddd");list.print(ddd);Node node = list.arrayToList(new String[]{"2","3","4"});list.print(node);// list.insert(1, "8");list.add("8");list.print(node);System.out.println();list.reverse();list.print(node);}
}
总结
自定义链表增,删除,链表逆序相关推荐
- 数据结构_Java_基于 线性表-单链表的初始化、逆序、去重、非递减序列的合并(开辟新链表先整体插入一个链表全部元素,再遍历另外一个链表寻找合适位置插入 、开辟新链表实现舍弃原链表)等操作实现
写在前面 不久前学习了数据结构线性表-数组-链表的相关知识,用C/C++语言实现了 单链表的系列相关操作 .见往期博客: 数据结构实验2_C语言_基于顺序表的非递减有序表的合并.线性表元素的增.删.改 ...
- C++-算法(80)-单链表与双链表的反转(逆序)
链表反转或者叫逆序是常用操作,网上有很多图文共有的说明文章,方法也多种多样. 其实我的理解,单链表赋值是对node->next 而非node ,而双向链表是对 node->last ...
- C语言通过链表指针删除链表节点的算法(附完整源码)
C语言通过链表指针删除链表节点的算法 C语言通过链表指针删除链表节点的算法完整源码(定义,实现,main函数测试) C语言通过链表指针删除链表节点的算法完整源码(定义,实现,main函数测试) #in ...
- 链表之删除链表中间节点
题目: 链表之删除链表中间节点 思路: 方法1: 我们先得到链表的长度,如果是奇数的话加一除以2,如果是偶数直接除以二, 得到的长度,然后从头结点开始遍历得到的长度前一个节点,然后把它删除 方法 ...
- 链表创建 删除 插入 逆置 打印 释放内存
#include <stdio.h> #include <stdlib.h> #include <string.h>//定义类型 typedef struct St ...
- 【leetcode】25. Reverse Nodes in k-Group 链表按K分段逆序
1. 题目 Given a linked list, reverse the nodes of a linked list k at a time and return its modified li ...
- 链表之删除链表a/b处的节点
题目: 删除链表a/b处的节点 比如链表1.2.3.4.5 如果a/b=r; 如果0<r<1/5;删除节点1 如果1/5<r<2/5;删除节点2 如果2/5<r< ...
- 【链表】删除链表的倒数第n个节点
思路:为了保持删除头结点和其他节点操作一致,引入虚拟头结点duumyNode. 假设链表长度为len,删除倒数第n个节点就是删除第len-n+1个节点,删除链表节点需要使用待删除节点 的前驱节点,所以 ...
- C++ leetcode 19. 删除链表的倒数第N个节点 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
一.思路: 遍历一遍存储节点到vector数组中,然后利用数组指向倒数第n个,将倒数n-1的节点的next指向倒数n的next 二.代码: class Solution { public:ListNo ...
- 通用版!完整代码,单链表SingleLinkedList增删改查,反转,逆序,有效数据等Java实现
文章目录 节点类 链表类(主要) 测试类 小结 节点类 可以根据需要,对节点属性进行修改.注意重写toString()方法,以便后续的输出操作. //节点类 class Node {public in ...
最新文章
- 使用Dozer框架进行Bean操作
- Cheese 游戏编程:第 4 部分 (转自MSDN)
- latex beamer 空一行_Beamer——基于LaTex的Slides制作
- js: 字符(字母) 与 ASCII码 转换方法
- 今天教你5种爆款标题,自媒体短视频标题写得好,月入过万少不了
- KRKR基础篇(二)
- 丰巢取快递系统(一)
- ILog项目开发流程【一】
- edxp已激活模块_edxposed框架模块
- 【C++】1023 组个最小数
- 【论文解读 CIKM 2018 | GEM】Heterogeneous Graph Neural Networks for Malicious Account Detection
- Linux 中 which、whereis、locate、find的区别
- Windows cmd 命令行清空
- 棋盘覆盖(java实现)
- selenium爬取巨潮资讯指定领域下所有上市公司的数据并存储到csv文件
- 如何定义数字化工厂,与智能工厂、工业4.0有什么联系
- 三体运动——基于MWORKS.Sysplorer研究初值对混沌系统数值求解的影响
- MVC 银行柜员业务绩效考核系统的设计与实现 毕业设计-附源码02133
- php放进文件夹里无法编译,基于nginx的zabbix安装问题
- HTML5实例教程——简易涂鸦板-何韬-专题视频课程
热门文章
- CSS 相对|绝对(relative/absolute)定位系列(三)
- stylus之其余参数(Rest Params)
- insert 和 insertSelective的区别
- 关于 spring 使用 mongodb 的 mongotemplate 对象操作数据库,对象注入问题(即该对象能否正常的调用相应的CRUD方法来处理数据)...
- 4Python切片功能剖析
- scp命令:服务器间远程复制代码
- python学习(十七) 扩展python
- MiseringThread.java 解析页面线程
- jquery的鼠标移入移出事件hover、mouseenter、mouseleave、mouseover、mouseout
- 地质灾害防治条例释义的摘要