算法通关存第一关------链表青铜挑战笔记

这篇具有很好参考价值的文章主要介绍了算法通关存第一关------链表青铜挑战笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、如何构造链表

public class Node {
    public int var;
    public Node next;
}

如上代码其实就已经构造出了一个链表。

定义一个Node结点类,他有两个属性var,和next。由于next是Node类型,这时候next又会指向同为Node类型的对象,这个对象也拥有var,和next两个属性,由此构造出一个链表。

文章最后会有构造链表实例,完整代码。

二、链表的插入、删除

  2.1 插入结点

在插入链表之前,先判断链表是否为空、位置参数是否合法。

//单链表插入
    public static Node insertNode(Node head, Node nodeInsert, int position) {
        //判断链表是否为空
        if (head == null) {//头结点为空,可以直接返回插入节点,也可以直接抛出异常
            return nodeInsert;
        }
        //判断位置参数是否合法
        int size = getLinkedListLength(head);
        if (position < 1 || position > size + 1) {
            System.out.println("位置参数越界了");
            return head;
        }
        return head;
    }

链表插入结点,可以分为头部插入和中部插入(尾部插入算法与之类似)。

public static Node insertNode(Node head, Node nodeInsert, int position) {
        //在链表头部插入结点
        if (position == 1) {
            nodeInsert.next = head;
            head = nodeInsert;
            return head;
        }
        //在链表中部或尾部添加结点
        //实现思路:先找到目标位置前一个结点,先将新增结点的next指向目标结点,然后将目标结点的next指向新增结点
        Node pNode = head;
        int count = 1;
        while (count < position - 1) {
            pNode = pNode.next;
            count++;
        }
        nodeInsert.next = pNode.next;
        pNode.next = nodeInsert;
        return head;
    }

注意:在插入结点时,应先将插入结点的next指向目标节点,然后将目标节点的前一个节点(pNode)的next指向插入节点。

考虑:为什么这两步为什么不能颠倒?

  2.2 删除结点 

在链表删除时,也要考虑链表是否为空链,参数是否合法,具体代码见 2.1 图一。

删除头部节点只需要将head指向head.next。

删除非头部节点的思想是,找到目标节点的前一个结点preNode,将preNode.next指向目标节点的next(即preNode.next.next=preNode)。

如下代码是将preNode.next指向目标节点curNode,然后将preNode.next指向curNode.next,由此把cerNode架空,被jvm收走。以上两种方法都可行。

//单链表删除节点
    public static Node deleteNode(Node head, int position) {
        //删除头结点
        if (position == 1) {
            head = head.next;
            return head;
        } else {
            //若不是头结点,则  
            // 先找到目标节点的前一个节点preNode,然后将preNode的next指向目标结点的next
            Node preNode = head;
            int count = 1;
            while (count < position - 1) {
                preNode = preNode.next;
                count++;
            }
            Node curNode = preNode.next;
            preNode.next = curNode.next;
            return head;
        }
    }

 实例

将给定数组转化为链表文章来源地址https://www.toymoban.com/news/detail-612577.html

public class BasicLink {
    public static void main(String[] args) {
        //给定数组,将其转化为链表
        int[] a = {1, 2, 3, 4, 5, 6};
        //调用自定义的静态初始化方法,将数组a传入参数
        Node head = initLinkedList(a);
        System.out.println(head);
    }
    //自定义链表 的 静态初始化方法
    private static Node initLinkedList(int[] array) {
        Node head = null, cur = null;
        for (int i = 0; i < array.length; i++) {
            //通过创建内部类对象,调用内部类的构造方法,并将数组中的元素赋值给结点的var属性
            Node newNode = new Node(array[i]);
            newNode.next = null;
            if (i == 0) {
                head = newNode;
                cur = newNode;
            } else {
                cur.next = newNode;
                cur = newNode;
            }
        }
        return head;
    }
    //内部类
    static class Node {
        public int var;
        public Node next;
        //构造方法,创建节点对象,并将参数x复制给var
        Node(int x) {
            var = x;
            next = null;
        }
    }

}

到了这里,关于算法通关存第一关------链表青铜挑战笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法通关村第一关-链表青铜挑战笔记

    平时我们一般都是用数组,每个数组都会有一个相对应的索引,这样就使得数组能够方便的调用出对应索引得到需要的数据,但是这也造成了一个问题,那就是不好在数组中插入或者删除一个数据,例如 int arr[]={1,2,4,5}如果我想在数组中的2和4中添加一个数据3 那么我们首先就

    2024年02月15日
    浏览(32)
  • 算法通关村第一关——链表青铜挑战笔记

    链表的基本单元就是 节点 ,也就是说链表是由一个一个节点构成的。 而对于节点来说,里面至少会包含一个 指针 和一个 数据元素 ,也就是如下图所示: 其中数据域用来存放数据元素,指针域用来存放指向下一个节点的指针,这样一个一个连接起来的就是链表。如下图所

    2024年02月16日
    浏览(33)
  • [Go版]算法通关村第一关青铜——链表青铜挑战笔记

    单向链表图示: 双向链表图示: 环形单向链表图示: 环形双向链表图示: 源码地址: GitHub-golang版本 如果是单向的,需要将当前节点 定位到要插入节点的前一个节点 ,否则一旦过了将无法回头找到前一个节点 如果是双向的,将当前节点 定位到要插入节点的前一个节点、

    2024年02月13日
    浏览(29)
  • 【无标题】算法通关村第一关——链表青铜挑战笔记

    算法通关村第一关——链表青铜挑战笔记 C语言是如何构造出链表的 0.定义节点结构 1.建立头指针 2.建立temp指针 3.将节点连起来 3.1 把p指向temp 3.2 设立循环节点a+temp指向a+temp变为a

    2024年02月15日
    浏览(29)
  • 算法通关村第一关——链表青铜挑战笔记(单链表)

    在LeeCode中一般这样创建链表 要注意创建一个变量来遍历,不要把head丢掉了 count position - 1可以方便操作,还能防止下标越界(cur为null)

    2024年02月15日
    浏览(30)
  • [Go版]算法通关村第一关——链表青铜挑战笔记

    单向链表图示: 双向链表图示: 环形单向链表图示: 环形双向链表图示: 源码地址: GitHub-golang版本 如果是单向的,需要将当前节点 定位到要插入节点的前一个节点 ,否则一旦过了将无法回头找到前一个节点 如果是双向的,将当前节点 定位到要插入节点的前一个节点、

    2024年02月15日
    浏览(36)
  • 编程导航算法通关村第一关|青铜|链表基础

    JVM有栈区和堆区 栈区:存引用,就是指向实际对象的地址。。 堆区:存的是创建的对象。 定义 规范的链表定义 LeetCode算法题中常用 遍历 插入 删除 结点 结构遍历 插入 从头插入 从尾插入 从某个值为key的节点后面插入 删除 删除头结点 删除尾结点 按值删除

    2024年02月15日
    浏览(34)
  • 算法通关第十九关-青铜挑战理解动态规划

    大家好我是苏麟 , 今天聊聊动态规划 . 动态规划是最热门、最重要的算法思想之一,在面试中大量出现,而且题目整体都偏难一些对于大部人来说,最大的问题是不知道动态规划到底是怎么回事。很多人看教程等,都被里面的状态子问题、状态转移方程等等劝退了。 其实,所

    2024年02月03日
    浏览(27)
  • 算法通关村|青铜挑战----链表

    前言:数据结构的基础:创建+增删改查 学习目标:单链表的创建+增删改查,双链表的创建+增删改查 数据域+指针域 数据域:当前节点的元素值 指针域:当前节点保存的下一个节点的元素的地址,其中最后一个元素的指针域指向null 标准的面向对象的节点的定义: LeetCode中节

    2024年02月15日
    浏览(26)
  • 1.1链表青铜挑战笔记

    为每一个元素配一个指针,每个元素的指针都指向自己的直接后继元素。 逻辑关系:一对一   0-1链表基本结构:结点(数据域+指针域) 数据域:存储元素的值 指针域:存放指针 0-2构造方法 typedef struct link{         char elem;     //代表数据         struct link *next;      //代表

    2024年02月15日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包