链表(2)------数据结构

news2025/1/23 3:24:53

1)进行反转单链表:节点的值不发生改变,只需要进行修改节点的指向

进行测试的时候要给方法传入一个头结点

输入:1,2,3,4,5;

输出:5,4,3,2,1;

1)我们先写两个变量,front=head,current=front.next;我们设想一下只用这两个变量是否可以进行反转单链表的操作呢;

我让current.next=front,再让front=current;这是我们就发现current已经无法走到下一个节点了,因为此时current.next已经被修改了,所以我们可以让curNext来进行保存每一次反转操作的current.next的值(这个操作再循环中的第一条语句)

2)循环条件为current.next!=null;

public Node resverse()
{
    if(head==null)
    {
        throw new RuntimeException("链表长度为空");
    }
    Node front=null;
    Node current=head;
    Node currentNext=head.next;
    while(current!=null)
    {  currentNext=current.next;
        current.next=front;
        front=current;
        current=currentNext;
    }
    return front;
}

2.只遍历单链表一遍,找出链表的中间节点,如果有两个中间节点,那么返回第二个中间节点

输入:1,2,3,4,5,返回:3

输入:1,2,3,4,5,6,返回:4,如果一个链表有两个中间节点,那么我们返回第二个节点

先求出链表的长度,再走count/2步

class Solution {
    public ListNode middleNode(ListNode head) {
        ListNode current=head;
        int count=0;
        while(current!=null){
            current=current.next;
            count++;
        }
         current=head;
        for(int i=0;i<count/2;i++){//当我们的current走到count/2的位置的时候
       //恰好已经走到了链表的中间节点
            current=current.next;
        }
        return current;
    }
}

思路:快指针速度是慢指针速度的2倍,一个到结尾了,那么另一个就是中间位置:

1)进行快慢指针,我们可以定义一个快慢指针,一开始让fast节点和slow节点都指向head,然后我们指向循环,让fast一次走两步,让slow一次走一步;

奇数节点fast走到最后一步的时候fast.next为空

偶树节点fast走到最后一步的时候fast为空

2)最终slow就是中间节点

我们可以自己画图演示一下,链表长度为奇数或者链表长度是偶数的截至条件是不一样的

   public ListNode middleNode(ListNode head) {
       ListNode fast=head;
       ListNode slow=head;
       while(fast!=null&&fast.next!=null)
       {
           fast=fast.next.next;
           slow=slow.next;
       }
       return slow;
public ListNode middleNode(ListNode head) {
        if(head==null){
            return null;
        }
     ListNode fast=head;
     ListNode slow=head;
         while(true){
          if(fast==null||fast.next==null){
                 return slow;
             }
             fast=fast.next.next;
             slow=slow.next;
         }
    }

此时那一个判断条件if(fast==null||fast.next==null)必须写在让指针进行移动的前面,因为此时如果连表中只有一个元素的时候,否则会发生空指针异常

第三题:找出链表中的倒数第K个节点,能不能遍历单链表一遍

要找到倒数第K个,要从前向后走len-k步(至少要遍历两遍,因为首先要知道链表的长度); 

1)我们进行定义两个快慢指针,fast为快指针,slow是慢指针,我们先让fast走k-1步

2)然后再让fast和slow同时走;等到fast.next为空的时候(或者说fast走到最后一个节点)

3)并返回slow节点,这时的slow才为倒数第K个节点;

从倒数第三个到倒数第一个 走几步?需要走两步

从倒数第四个到倒数第一个 走几步?需要走三步

从倒数第K个到倒数第一个  走几步?需要走k-1步

2)更简单的方法是先求出链表的长度,让current走len-k步,但是需要进行遍历单链表现要求出但是链表长度

class Solution {
    public ListNode getKthFromEnd(ListNode head, int k) {
          if(k<=0||k>size()){
//必须加上,否则下面的循环会出现空指针异常,再循环走k-1步的时候会发生空指针异常
            return null;
            }
        int count=0;
        ListNode current=head;
        while(current!=null){
            count++;
            current=current.next;
        }
        current=head;
        for(int i=0;i<count-k;i++){//当走到count-k的位置的时候,循环退出
              current=current.next;
        }
     return current;
    }
}

public Node returnLastK(int index)
{
    if(index<0)
    {
        throw new UnsupportedOperationException("此时的链表的倒数第K个节点位置不正确");
    }
    if(head==null)
    {
        throw new UnsupportedOperationException("此时链表长度是空");
    }
    Node fast=head;
    Node slow=head;
    for(int i=0;i<index-1;i++)
    {  fast=fast.next;
        if(fast==null)
        {
            throw new UnsupportedOperationException("当前你输入的index的值已经超过了链表的长度");
        }
    }
    while(fast.next!=null)
    {
        fast=fast.next;
        slow=slow.next;
    }
    return slow;
}

4.合并两个有序链表

思路:

1)我们首先定义一个虚拟节点是newHead作为要合并在一起的总链表的新节点,注意它是一个虚拟节点,里面的值是任意的

2)我们再合并headA和headB这两个链表的时候,保存两个链表的右节点是没有什么用处的,如果发现headA.data>headB.data,我们就把HeadA指向的这个头结点放到先开辟的链表后面,同时让headA进行向后移动

   if(headA.data>headB.data)

      {

       }else if(HeadA.data<HeadB.data){

   }else{

   }

3)再进行合并的过程中,两个链表所走的过程中都不可以是空的,所以循环条件是HeadA!=null&&HeadB!=null

4)在循环出来之后,会出现一种情况,HeadA过长或者HeadB过长,此时我们还要进行特殊处理

 public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        ListNode HeadA=list1;
        ListNode HeadB=list2;
        ListNode newHead=new ListNode(-1);
       ListNode temp=newHead;
        while(HeadA!=null&&HeadB!=null)
        {
            if(HeadA.val<HeadB.val)
            {
                temp.next=HeadA;
                HeadA=HeadA.next;
                temp=temp.next;
            }else
            {
                temp.next=HeadB;
                HeadB=HeadB.next;
                temp=temp.next;
            }
        }
        if(HeadA!=null)
        {
            temp.next=HeadA;
        }
        if(HeadB!=null)
        {
            temp.next=HeadB;
        }
        return newHead.next;
class Solution {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
       ListNode head1=list1;
       ListNode head2=list2;
       ListNode newHead=new ListNode(-1);
       ListNode current=newHead;
       while(head1!=null&&head2!=null){
           if(head1.val>head2.val){
               current.next=head2;
               head2=head2.next;
               current=current.next;
           }else{
               current.next=head1;
               head1=head1.next;
               current=current.next;
           }
       }
       while(head1!=null){
             current.next=head1;
             head1=head1.next;
             current=current.next;
       }
       while(head2!=null){
              current.next=head2;
              head2=head2.next;
              current=current.next;
       }
       current.next=null;
       return newHead.next;
    }
}

下一种写法更推荐

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/105422.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从0到1介绍一下开源大数据比对平台dataCompare

1.背景&现状 在大数据领域也已经工作了多年&#xff0c;无论所待过的大公司还是小公司&#xff0c;都会遇到集群升级迁移过程中据搬迁等相关工作&#xff0c;经常会碰到搬迁之后&#xff0c;搬迁的数据是不是能对的上呢&#xff1f;两边数据究竟是不是一致的呢&#xff1f…

javaee之Mybatis4

延迟加载与立即加载的概念 Mybatis中的延迟加载与立即加载 一、一对一实现延迟加载的步骤&#xff08;多对一&#xff0c;看成一对一&#xff09; 我们这里是利用account表中的一个方法来做 先来看IAccountDao里面的一个方法 然后再去看持久层IAccountDao.xml 这个方法给我们…

Linux学习-92-SELinux管理

18 SELinux管理 root 用户在 Linux 系统当中就是无所不能的&#xff0c;而且读、写和执行权限对 root 用户完全没有作用。root 用户的存在极大地方便了 Linux 的管理&#xff0c;但是也造成了一定的安全隐患。绝大多数系统的严重错误都是由于 root 用户的误操作引起的&#xff…

开源项目 Spartacus 的 git 分支使用规范

Spartacus 开源项目里存在如下的 git 分支&#xff1a; feature/GH-xxxx 分支用于简单的功能和错误修复epic/epic-name 分支用于大功能的开发release/1.4.0-rc.0 分支用于特定的发布&#xff08;你可以将它们与维护分支区分开来&#xff0c;因为包含了完整的版本号&#xff09…

压力测试笔记

压测学习 要求&#xff1a;满足100并发500ms性能要求 压测场景 新系统上线支持 在新系统上线前&#xff0c;通过执行性能压测能够对系统的负载能力有较为清晰的认知&#xff0c;从而结合预估的潜在用户数量保障系统上线后的用户体验。技术升级验证 在系统重构过程中&#xf…

Github每日精选(第80期):自动生成命令行python-fire

Python Fire 是一个用于从绝对任何Python对象自动生成命令行界面 (CLI) 的库。 Python Fire 是一种在 Python 中创建 CLI 的简单方法。 [1]Python Fire 是用于开发和调试 Python 代码的有用工具。 [2]Python Fire 有助于探索现有代码或将其他人的代码转换为 CLI。[3]Python Fi…

Co-Scale Conv-Attentional Image Transformers

Co-Scale Conv-Attentional Image Transformers一、引言二、实现方法&#xff08;一&#xff09;、Conv-Attention Module三、Co-Scale Conv-Attentional Transformers&#xff08;一&#xff09;、Co-Scale串行块&#xff08;二&#xff09;、Co-Scale并行块&#xff08;三&am…

跳频和扩频通信

跳频(FH, Frequency Hopping)是指载波频率在很宽频率范围内按某种序列或图案进行跳变&#xff0c;它能进一步提高系统的抗干扰性能。 跳频技术改善了无线信号的传输质量&#xff0c;可以明显地降低同频干扰和频率选择性衰落&#xff0c;为了避免在同一小区或临近小区中&#xf…

无惧管控放开,分享居家办公、远程办公项目经验

国家已经放开疫情管控&#xff0c;随之而来的&#xff0c;是各地大面积的“小阳人”爆发&#xff0c;很多企业不得不重新启动远程办公机制。 云盒子科技拥有良好的的远程办公经验&#xff0c;产品是包含企业云盘、流程审批、邮件、通讯录、企业公告一体化的在线文档协作平台。…

Ubuntu18.04下调用fastdds实现通信

提纲 1、编写idl 2、fastddsgen生成cpp的源代码文件 3、编译生成可执行文件 4、执行可执行文件完成通讯 1、编写idl 现在我们可以编写一个简单的 IDL&#xff1a; 2、fastddsgen生成cpp的源代码文件 编写好idl后&#xff0c;就可以通过 fastddsgen 快速生成代码。 最终会自动…

【Vsan数据恢复】Vsan分布式文件系统数据丢失的数据恢复

vSAN存储数据恢复环境&#xff1a; 某公司一台vSAN分布式文件系统存储设备&#xff1b; VSAN存储采用了超融合架构&#xff0c;存储内总共有24块硬盘。 vSAN存储故障&初检&#xff1a; 由于未知原因关机重启&#xff0c;逻辑架构出现严重故障&#xff0c;上层虚拟机瘫痪&am…

新冠确诊阳性后的第一篇博客,一文带你学习SQL注入

新冠确诊阳性后的第一篇博客&#xff0c;一文带你学习SQL注入1.你好SQL注入2.盲注3.Timing Attack4.常见的攻击技巧5.SQL CoIumn Truncation6.防御SQL注入SQL注入防御的误区使用预编译语句使用存储过程SQL注入攻击属于注入攻击的一种&#xff0c;注入攻击的本质&#xff0c;是把…

echarts3D柱状图,多个柱子,单个柱子,传参即可

<template><!-- 折线图 --><div ref"line" class"line"></div> </template><script> // colorList 横条颜色数组 // data 数据 格式为&#xff1a; [] // areaStyle 渐变色 import * as echarts from echarts import…

AOT(超前编译)实例分析

文章目录一、背景二、具体实施2.1 tfcomfile 是什么&#xff1f;2.2 tfcompile 的功能是什么&#xff1f;2.3使用tfcompile三、总结一、背景 前边已经了解了JIT和AOT的基本概念&#xff0c;AOT(提前编译)方式就是在代码执行阶段之前全部编译成目标指令&#xff0c;进入执行阶段…

自动网络搜索NAS之FBNetV1

1. 摘要 为移动设备设计卷积网络挑战巨大&#xff0c;因为设计空间巨大&#xff0c;现有NAS方法在计算上是昂贵的。另外&#xff0c;之前的工作关注降低FLOPs&#xff0c;但是FLOPs并不总是反应真实的延迟。因此基于differentiable neural architecture search&#xff08;DNA…

sd卡怎么格式化?5个步骤轻松教会你

随着SD卡的广泛使用&#xff0c;总会有各种情况导致SD卡必须要格式化才行。但是格式化有没有办法执行&#xff0c;sd卡怎么格式化&#xff1f;还有人会因为误操作导致的数据丢失。现在&#xff0c;小编就给大家介绍一下怎么格式化SD卡&#xff1f;以及格式化后SD卡数据的恢复方…

VUE3-模板语法《二》

首先看到这张图&#xff0c;左边的结构就不分析了&#xff0c;上一章有说明顺序。 中间红色的部分&#xff0c;分为3块&#xff0c;第一块是模板&#xff0c;里面写html&#xff1b;第二块是脚本语言&#xff0c;里面写js或者ts语言&#xff0c;lang"ts"就是ts语法…

GreatSQL MGR 使用 IPv6 连接

GreatSQL社区原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本&#xff0c;使用上与MySQL一致。作者&#xff1a;王权富贵文章来源&#xff1a;社区原创 1.概述 本文基于 GreatSQL 8.0.25-16 &#xff0c;以下测试均使用此版…

嵌入式:Load/Store之单寄存器的存取指令

文章目录Load/Store指令分类单寄存器的存取指令1、单字和无符号字节的数据传送指令指令说明指令汇编格式2、半字和有符号字节的数据传送指令指令汇编格式ARM处理器是Load/Store型的&#xff0c;即它对数据的操作是通过将数据从存储器加载到片内寄存器中进行处理&#xff0c;处理…

SuperMap iPortal 对接postgis业务数据库(二):大屏使用接口数据更新图表和地图

本文是SuperMap iPortal 对接postgis业务数据库的第二个步骤&#xff1a;大屏使用接口数据更新图表和地图。 这个步骤可以有两种方式去实现数据的展示和更新如下&#xff1a; 一、使用数据上图构建地图并在大屏中使用 1. 数据上图构建地图 打开iPortal 应用中心的数据上图&a…