夜月一帘幽梦,春风十里“三指针法“ (链表面试题篇2)

本篇会加入个人的所谓鱼式疯言

❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言
而是理解过并总结出来通俗易懂的大白话,
小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.
🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 !!!

请添加图片描述

前言

在上一篇文章中

我们讲解了

  1. 寻找链表的 中间结点 : 用 快慢指针 的速度差解决 中点问题 的理解
  1. 判断链表是否带环: 因为 ,快慢直接总会一点一点相遇的 快慢指针 的熟悉
  1. 返回链表倒数第 k 个节点: 更扩展了,快慢指针 也不一定先一起走,也有可能 快指针 先走,慢指针 再跟着的思想

而今天我们主要讲解 “三指针” 在链表面试题中运用

下面让小编结合具体的题目,给小伙伴细细道来吧 💖 💖 💖 💖

目录

  1. 反转链表
  2. 链表的回文结构

一. 反转链表

反转链表题目链接

1. 题目描述

在这里插入图片描述

2. 解题思路

  1. 首先我们声明 三个引用类型 cur head curN ,先让 cur 置为 null head为头节点, curN 为头结点的下一个节点

请添加图片描述

  1. 先讲 head 连接 cur 接着我们让 cur 走到 head ,head 走到 curN curN 走到下一个节点 ,循环往复,直到 curNnull

3. 题解代码(Java)


/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
 
class Solution {
    public ListNode reverseList(ListNode head) {
            if(head==null) {
                return head;
            } 
            
            ListNode cur=head.next;
            head.next=null;
            while(cur != null) {
                ListNode curN=cur.next;
                cur.next=head;
                head=cur;
                cur=curN;
            }
        
            return head;
    }
}

在这里插入图片描述

鱼式疯言

简单来说

三指针法 也叫 头插法

一个指针 curN 带头 ,后面 两个指针头变成尾 ,这便是 三指针 头插 法 的含义

二. 链表的回文结构

1. 题目描述

在这里插入图片描述

链表的回文结构题目链接

2. 解题思路

  1. 首先 结合我们学过的 快慢指针法 找到 中间 位置

什么 💥💥💥 有小伙伴不知道 快慢指针法 别急别急,不懂的小伙伴查看下面链接哦

快慢指针法

  1. 然后在中间位置进行 三指针法 进行 头插 操作
  1. 然后首尾 相反 方向一起走,开始判断 首尾 是否 相同 ,直到相遇

<1>. 节点数为 偶数 时

请添加图片描述

<2>. 节点数为 奇数 时

请添加图片描述

3. 题解代码(Java)

import java.util.*;

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class PalindromeList {
    public boolean chkPalindrome(ListNode A) {

        if(A==null) {
            return false;
        }

        ListNode dev=A;

        ListNode fast =A,slow=A;

        while(fast != null && fast.next != null) {
            slow=slow.next;
            fast=fast.next.next;
        }

        ListNode cur=slow.next;

        while(cur != null) {
            ListNode Ncur=cur.next;
            cur.next=slow;
            slow=cur;
            cur=Ncur;
        }

        while(A != slow) {
            if(A.val != slow.val){
                return false;
            }
            if(A.next==slow) {
                return true;
            }        
            A=A.next;
            slow=slow.next;
        }

     return true;
}
}

在这里插入图片描述

鱼式疯言

要点:

在本题我们利用了 快慢指针的头插三指针 的方法

注意:

当节点数为 偶数

就需要 判断 A.next==slow 是否成立 ,这点一定要主要,否则就很有可能进入 无限循环

总结

  • 反转链表 : 体会到三指针在反转链表的实用性

  • 链表的回文结构:利用了快慢指针的头插 ,三指针 的方法 的结合从中解决了本题

如果觉得小编写的还不错的咱可支持 三连 下 (定有回访哦) , 不妥当的咱请评论区 指正

希望我的文章能给各位宝子们带来哪怕一点点的收获就是 小编创作 的最大 动力 💖 💖 💖

在这里插入图片描述

  • 60
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 30
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值