首页 > 其他分享 >链表的练习

链表的练习

时间:2024-05-31 17:02:05浏览次数:19  
标签:head slow ListNode 练习 next 链表 null 节点

目录

一、链表的反转

二、查找中间节点

三、查找倒数第k个节点

四、整合两个链表

五、判断是否回文


一、链表的反转

对单链表进行反转,把头节点置为空,然后将头节点后面的节点依次插入到头节点的前面。

public ListNode ReverseList(){

        if (head==null){ //链表为空

            return null;

        }if (head.next==null){ //只有一个节点

            return head;

        }

        ListNode cur=head.next; //记录头节点的下一位

        head.next=null; //将头节点置为空

        while (cur!=null){

            ListNode curNext=cur.next; //记录下一次要插入的节点

            cur.next=head;

            head=cur;

            cur=curNext;

        }

        return head;
    }

二、查找中间节点

  定义两个节点,同时从头节点进行往后走,一个一次走两步,一个一次走一步,最后当节点数量为偶数时快的节点为空和节点数量为奇数时快的节点的next为空时,慢的节点所在的位置就是中间节点。

public ListNode MiddleList(ListNode head){

        ListNode fast=head;

        ListNode slow=head;

        while (fast!=null && fast.next!=null){

            fast=fast.next.next; //走两步

            slow=slow.next; //走一步

        }

        return slow;
    }

三、查找倒数第k个节点

  定义两个节点,一个节点先走k-1步,然后两个节点一起走,当快的节点走到最后一个节点的位置时,慢的节点的位置就是倒数第k个节点所在的位置。

 public ListNode FindK1(int k){

        if (k<0){

            return null;
        }

        ListNode fast=head;

        ListNode slow=head;

        int count=0;

        while (k-1!=count){ //走了k-1步时

            fast=fast.next;

            if (fast==null){

                return null;
            }
            while (fast.next!=null){ //快的节点走到了最后一个节点所在的位置

                fast=fast.next;

                slow=slow.next;
            }

        }

        return slow;
    }

四、整合两个链表

  将两个单链表根据顺序大小串联起来,创建一个新的链表,根据两个链表每个节点大小的比较,将小的节点,用新创建的链表串联起来。

public static MySingleList.ListNode merageTwoLists(MySingleList.ListNode head1,MySingleList.ListNode head2){ //创建两个链表

    MySingleList.ListNode newH=new MySingleList.ListNode(-1); //先创建一个链表

    MySingleList.ListNode temp=newH; //用temp这个节点对后面的节点进行连接


    while (head1!=null && head2!=null){

      if (head1.val<head2.val){

        temp.next=head1; 

        head1=head1.next;

      }else {

        temp.next=head2;

        head2=head2.next;

      }

      temp=temp.next; //往后进行连接
    }

    if (head1!=null){

      temp.next=head1;

    }

    if (head2!=null){

      temp.next=head2;

    }

    return newH.next;

  }

  public static void main(String[] args) {

    MySingleList list = new MySingleList();

    list.addLast(1);
    list.addLast(3);
    list.addLast(5);

    list.display(list.head);


    MySingleList list1=new MySingleList();

    list1.addLast(2);
    list1.addLast(4);
    list1.addLast(6);

    list1.display(list1.head);

MySingleList.ListNode head=merageTwoLists(list.head,list1.head);

list.display(head);

执行结果:

1 3 5 
2 4 6 
1 2 3 4 5 6 
 


五、判断是否回文

  判断链表是否回文,找到中间节点,将中间节点后面的链表方向进行反转,然后从前往后,从后往前进行判断。

public boolean chkPalindrome() {

        ListNode fast = head;
        ListNode slow = head;

        if (head == null || head.next == null) {

            return true;

        }

        while (fast != null && fast.next != null) { //查找中间节点

            fast = fast.next.next;
            slow = slow.next;
        }

        ListNode cur = slow.next; //方向进行反转

        while (cur != null) {

            ListNode curNext = cur.next;

            cur.next = slow;

            slow = cur;

            cur = curNext;

        }

        while (head != slow) { //从前往后,从后往前进行判断

            if (head.val != slow.val) {

                return false;
            }

            if (head.next == slow) { //偶数情况下

                return true;

            }

            head = head.next;

            slow = slow.next;
        }

        return true;

    }

标签:head,slow,ListNode,练习,next,链表,null,节点
From: https://blog.csdn.net/2301_80706853/article/details/139353700

相关文章

  • 《Java练习题》Java编程题合集(全)
    《Java练习题》Java编程题合集(全) 前言:不仅仅要实现,更要提升性能,精益求精,用尽量少的时间复杂度和空间复杂度解决问题。初学者:《Java练习题》习题集一  https://www.cnblogs.com/jssj/p/11147566.html《Java练习题》习题集二  https://www.cnblogs.com/jssj/p/1122235......
  • 互斥锁练习题
    练习:设计一个程序,程序中有3个线程,主线程A创建一个文本,每隔5s获取一次系统时间并写入到该文本中,另外两个线程B和C分别从文本中读取当前的时间和日期,子线程B输出系统时间"hh:mm:ss",子线程c输出系统日期"2024年05月31日”,要求使用读写锁实现互斥。提示:主线程A获取写操作的锁,另外......
  • C语言练习题之——从简单到烧脑(11)(每日两道)
    题目1:有两个矩阵a[3][2],b[2][2],元素值由键盘输入,计算a与b的矩阵之和(两个矩阵循环中相加,结尾求和)#include<stdio.h>intmain(){ intarr[3][2],brr[2][2],i,j,sum1=0,sum2=0; for(i=0;i<3;i++) { for(j=0;j<2;j++) { scanf_s("%d",&arr[i][j]);......
  • 一千题,No.0039(反转链表)
    给定一个常数 K 以及一个单链表 L,请编写程序将 L 中每 K 个结点反转。例如:给定 L 为1→2→3→4→5→6,K 为3,则输出应该为3→2→1→6→5→4;如果 K 为4,则输出应该为4→3→2→1→5→6,即最后不到 K 个元素不反转。输入格式:每个输入包含1个测试用例。每个测试......
  • 链表9(优化版)7-9 sdut-C语言实验-约瑟夫问题
    7-9sdut-C语言实验-约瑟夫问题分数20全屏浏览切换布局作者 马新娟单位 山东理工大学n个人想玩残酷的死亡游戏,游戏规则如下:n个人进行编号,分别从1到n,排成一个圈,顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。请输出最后一个人的编号......
  • 数据结构 顺序表(C语言 与 Java实现)以及部分练习题
    目录数据结构数组(顺序表)特点使用Java实现更高级的数组C语言实现总结优点缺点例题26.删除有序数组中的重复项1.两数之和27.移除元素153.寻找旋转排序数组中的最小值485.最大连续1的个数414.第三大的数2656.K个元素的最大和LCP06.拿硬币2057.值相等的最小索引26.删......
  • JavaSE 面向对象程序设计 文件File 介绍练习加千行代码详解
    介绍在Java中,File类是用于表示文件和目录路径的抽象。它提供了一组方法来创建、删除、重命名、检查文件/目录的存在性、以及查询文件/目录的属性等功能。File类可以用于执行文件系统操作,如创建新文件、删除文件、检查文件是否存在等。目的是把字符串先表示为路径然后转化......
  • 环形链表II
    前两天一直在debug,今天才有时间好好刷一下力扣,今天在代码随想录上看到环形链表,链接如下:https://leetcode.cn/problems/linked-list-cycle-ii/description/这道题官方有两种解法,一种是相对比较简单的哈希表,还有一种是利用数学计算出他们的规律进而解题。首先说第二种,在示例中......
  • 线程练习题
    编写一个程序,主线程中创建一个子线程,容纳后让主线程先退出并返回一个值,子线程接合主线程后输出主线程的退出值,然后子线程退出./********************************************************************* filename:pthread.c* author :Dazz* date :2024/05/29*......
  • leetCode.82. 删除排序链表中的重复元素 II
    leetCode.82.删除排序链表中的重复元素II题目思路:代码classSolution{public:ListNode*deleteDuplicates(ListNode*head){autodummy=newListNode(-1);dummy->next=head;autop=dummy;while(p->next){......