栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java解析剑指Offer链表篇(1)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java解析剑指Offer链表篇(1)

目录

一、移除链表元素

1、题目要求

2、基本思路

 3、代码演示

二、反转链表 

 1、题目要求

2、基本思路

3、代码实现

三、链表的中间结点

1、题目要求

2、基本思路

3、代码实现

四、链表中倒数第k个结点 

1、题目要求

2、基本思路

3、代码演示

一、移除链表元素

1、题目要求

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

203. 移除链表元素 - 力扣(LeetCode)

2、基本思路

首先建立两个结点,一个为cur,一个为perv,perv这个结点用来连接与val不相同的数,因此perv从Head开始,而cur的任务是去排除与val相同的数,如下图:

假如cur.val == val,则这个结点不符合要求,跳过这个结点,cur = cur.next,perv结点不动,直到cur结点发现cur.val != val,那么perv的结点指向cur,也就是perv.next = cur。就这样循环直到cur遍历完整个链表,也就是cur == null 。

但是还有一种情况需要我们思考,就是假如,Head.val == val我们该怎么办 ?

这个很简单,因为经过的刚刚perv和cur结点的帮忙,我们以及得到了除了Head.val没有判断是否与val相同其他结点都!=val的链表,所以到最后我们可以利用if语句来判断假如Head.val == val,那么Head = Head.next即可。

 3、代码演示
class Solution {
    public ListNode removeElements(ListNode head, int val) {
        if(head == null){
            return null;
        }
       
          ListNode perv = head;
          ListNode cur = head.next;
          while(cur != null){
              if(cur.val == val){
                  perv.next = cur.next;
                  cur = cur.next;
              }else{
                  perv = cur;
                  cur = cur.next;
              }
          }
           if(head.val == val){
              head = head.next;
          }
          
          
          return head;
    }
}

二、反转链表 

 1、题目要求

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

206. 反转链表 - 力扣(LeetCode)

2、基本思路

首先我们还需要建立两个结点,一个结点为perv,另外一个cur,perv作为我们反转链表之后的头结点,因此刚刚开始我们应该把他定义为null,而cur主要作为哨兵结点,用来反转链表,因此我们将它从Head开始

我们只需要考虑一次两个链表反转的过程其他直接交给循环就好了,因此首先我们得引用一个新的结点来保存cur.next,因为后续反转链表cur.next会变成perv,不保存的话会导致后面的链表丢失,然后将cur.next = perv,然后再将perv = cur ,cur只想下一个结点,准备下一次的反转。这样就反转好了一个链表中的前后结点。

 接下来只需考虑循环,当cur  == null的时候也就意味着整个链表遍历完毕,也就是整个链表反转完成,我们直接返回perv结点即可。 

 

3、代码实现
class Solution {
    public ListNode reverseList(ListNode head) {
        if(head == null){
            return null;
        }
       ListNode perv = null;
       ListNode cur = head;
       while(cur != null){
           ListNode curNext = cur.next;
           cur.next = perv;
           perv = cur;
           cur = curNext;
       }
       return perv;
    }
}

三、链表的中间结点 1、题目要求

给定一个头结点为 head 的非空单链表,返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

876. 链表的中间结点

2、基本思路

因为需要返回中间结点,也就是整个链表位于中间位置的元素,因此也就是sizeNodeList/2位置的元素,有一种很暴力的方法也就是遍历一次链表,得到链表的长度,然后在/2,得到了目标数的指定位置,然后我们在遍历一遍链表返回所得结点,这样看太过于暴力,我们需要思考如何通过一次遍历链表就可以得到我们想要的东西呢?

众所周知,假如一个物体A是另一个物体B速度的二倍,则在相同时间内,A行驶的路程也是B的二倍,有了这个思路,这个题也就迎刃而解了,我们可以设置两个结点一个为fast,一个为low,fast结点为low结点遍历的二倍,这样当fast == null并且 fast.next == null 的时候,low结点也就刚好到了中间,我们直接返回就好。

3、代码实现
class Solution {
    public ListNode middleNode(ListNode head) {
        if(head == null){
            return null;
        }
     ListNode fast = head;
     ListNode low = head;
     while(fast != null&& fast.next != null){
         fast = fast.next.next;
         low = low.next;
     }
     return low;
    }
}

四、链表中倒数第k个结点  1、题目要求

输入一个链表,输出该链表中倒数第k个结点

链表中倒数第k个结点_牛客题霸_牛客网 (nowcoder.com)

2、基本思路

这个题,大多数的人想法都是使用暴力的方法来直接获得我们想得到的东西,但是太过于麻烦,,这个题我们依旧可以只遍历一次链表从而得到我们想要的东西。

首先我们需要定义两个结点,一个fast,一个low ,fast首先从链表的head开始往后走k - 1,这时候low保持不变

这样他们两之间就存在了差距,然后我们的fast与low开始同步前进,当我们的fast走到了最后时,也就是走到了 链表的尾巴,因为我们low和fast之间有差距,因为这个差距是根据他需要倒数第k个结点决定的,因此我们的low也就理所应当的成为了我们最后想要得到的结果。

 

注意!!我们需要考虑K的大小问题,假如K<=0,则说明不存在,或者K >= sizeNodeList时,但是问题来了,我们不知道链表长度啊,我们该怎么办呢?

在我们在fast结点的时候我们就可以判断这个条件,我们在建立差距的时候,fast == null,则说明这个K超出范围。 这样就解决了这个问题。

3、代码演示
public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
       if(head == null|| k <= 0){
           return null;
       }
        ListNode fast = head;
        ListNode low = head;
        while(k - 1 != 0){
            fast = fast.next;
            if(fast == null){
                return null;
            }
            k--;
        }
        while(fast.next != null){
            fast = fast.next;
            low = low.next;
        }
        return low;
    }
}

 

 

 

 

 

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/924114.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号