工作时间长了,经常用框架,感觉真的成了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);}
}

总结

自定义链表增,删除,链表逆序相关推荐

  1. 数据结构_Java_基于 线性表-单链表的初始化、逆序、去重、非递减序列的合并(开辟新链表先整体插入一个链表全部元素,再遍历另外一个链表寻找合适位置插入 、开辟新链表实现舍弃原链表)等操作实现

    写在前面 不久前学习了数据结构线性表-数组-链表的相关知识,用C/C++语言实现了 单链表的系列相关操作 .见往期博客: 数据结构实验2_C语言_基于顺序表的非递减有序表的合并.线性表元素的增.删.改 ...

  2. C++-算法(80)-单链表与双链表的反转(逆序)

    链表反转或者叫逆序是常用操作,网上有很多图文共有的说明文章,方法也多种多样.    其实我的理解,单链表赋值是对node->next 而非node ,而双向链表是对 node->last ...

  3. C语言通过链表指针删除链表节点的算法(附完整源码)

    C语言通过链表指针删除链表节点的算法 C语言通过链表指针删除链表节点的算法完整源码(定义,实现,main函数测试) C语言通过链表指针删除链表节点的算法完整源码(定义,实现,main函数测试) #in ...

  4. 链表之删除链表中间节点

    题目: 链表之删除链表中间节点 思路: 方法1: 我们先得到链表的长度,如果是奇数的话加一除以2,如果是偶数直接除以二,  得到的长度,然后从头结点开始遍历得到的长度前一个节点,然后把它删除   方法 ...

  5. 链表创建 删除 插入 逆置 打印 释放内存

    #include <stdio.h> #include <stdlib.h> #include <string.h>//定义类型 typedef struct St ...

  6. 【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 ...

  7. 链表之删除链表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< ...

  8. 【链表】删除链表的倒数第n个节点

    思路:为了保持删除头结点和其他节点操作一致,引入虚拟头结点duumyNode. 假设链表长度为len,删除倒数第n个节点就是删除第len-n+1个节点,删除链表节点需要使用待删除节点 的前驱节点,所以 ...

  9. C++ leetcode 19. 删除链表的倒数第N个节点 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。

    一.思路: 遍历一遍存储节点到vector数组中,然后利用数组指向倒数第n个,将倒数n-1的节点的next指向倒数n的next 二.代码: class Solution { public:ListNo ...

  10. 通用版!完整代码,单链表SingleLinkedList增删改查,反转,逆序,有效数据等Java实现

    文章目录 节点类 链表类(主要) 测试类 小结 节点类 可以根据需要,对节点属性进行修改.注意重写toString()方法,以便后续的输出操作. //节点类 class Node {public in ...

最新文章

  1. 使用Dozer框架进行Bean操作
  2. Cheese 游戏编程:第 4 部分 (转自MSDN)
  3. latex beamer 空一行_Beamer——基于LaTex的Slides制作
  4. js: 字符(字母) 与 ASCII码 转换方法
  5. 今天教你5种爆款标题,自媒体短视频标题写得好,月入过万少不了
  6. KRKR基础篇(二)
  7. 丰巢取快递系统(一)
  8. ILog项目开发流程【一】
  9. edxp已激活模块_edxposed框架模块
  10. 【C++】1023 组个最小数
  11. 【论文解读 CIKM 2018 | GEM】Heterogeneous Graph Neural Networks for Malicious Account Detection
  12. Linux 中 which、whereis、locate、find的区别
  13. Windows cmd 命令行清空
  14. 棋盘覆盖(java实现)
  15. selenium爬取巨潮资讯指定领域下所有上市公司的数据并存储到csv文件
  16. 如何定义数字化工厂,与智能工厂、工业4.0有什么联系
  17. 三体运动——基于MWORKS.Sysplorer研究初值对混沌系统数值求解的影响
  18. MVC 银行柜员业务绩效考核系统的设计与实现 毕业设计-附源码02133
  19. php放进文件夹里无法编译,基于nginx的zabbix安装问题
  20. HTML5实例教程——简易涂鸦板-何韬-专题视频课程

热门文章

  1. CSS 相对|绝对(relative/absolute)定位系列(三)
  2. stylus之其余参数(Rest Params)
  3. insert 和 insertSelective的区别
  4. 关于 spring 使用 mongodb 的 mongotemplate 对象操作数据库,对象注入问题(即该对象能否正常的调用相应的CRUD方法来处理数据)...
  5. 4Python切片功能剖析
  6. scp命令:服务器间远程复制代码
  7. python学习(十七) 扩展python
  8. MiseringThread.java 解析页面线程
  9. jquery的鼠标移入移出事件hover、mouseenter、mouseleave、mouseover、mouseout
  10. 地质灾害防治条例释义的摘要