链表传一级指针以及leetcode做题有感

2024-04-17 07:44

本文主要是介绍链表传一级指针以及leetcode做题有感,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上个文章说要传二级指针,经过一段时间的学习之后才知道可以传一级指针:

之所以要传二级指针,是要改变一级指针的值,也就是把头节点的指针改变,如图:

从左边到右边,头指针 一级指针plist 的值发生改变所以要传二级指针。

        首先,我们要搞明白一个事情:如果头指针不发生改变,只改变中间链表的成员,那是否可以只传一级指针呢?答案是:可以。

        就拿plist后的第一个成员举例,我们创建了一个链表,plist指向了第一个成员的地址,也就是找到了第一个结构体(并非拷贝),当然可以改变第一个成员的元素,也就是可以从根本上改变这个链表成员的指向。

        解决了这个问题,如果要求头指针改变应该怎么办,我们可以返回新的头指针,所以就有了以下代码:这两种的函数都能起到相同的作用。

struct stu* SeqListPushBack(stu* plist, StructType num);
//记得 return new_head
void SeqListPushBack(stu** plist, StructType num);

接下来是leedcote做题的感受:每次做 leetcode 都感觉自己像个傻子。

有些链表题的经验总结一下:

1.一个探路一个指路:

        类似于这种简单删除的操作,需要验证pointer->number的值,根据真假来修改pointer_pre->next来修改链表的指向,通常会出现如下代码:

while(pointer==NULL){
pointer_pre=pointer;
pointer=pointer->next;
}

在上面的代码中,pointer_pre保存了pointer的值,接着pointer迭代一下。 

2.一个指路一个记路:

 

        如图所示,在翻转链表中,pointer 其实担任了指路和记路两个任务,因为 pointer->next 既要指向pointer_pre 同时也要遍历链表,但是 pointer->next 的值一旦改变就无法找到下一个链表成员,所以要先把链表成员的地址存起来,即 pointer_over=pointer->next,所以可能出现下面的代码:

        第一行代码是先把三个指针安排好位置,然后反转链表指向,最后两行和第一行保证三个指针迭代向前一个单位。

struct ListNode* reverseList(struct ListNode* head){
struct ListNode*pointer=head,*pointer_over=head,*pointer_pre=NULL;
while(pointer_over!=NULL){
pointer_over=pointer->next;
pointer->next=pointer_pre;
pointer_pre=pointer;
pointer=pointer_over;
}
return pointer_pre;
}

做链表的题一定要考虑指针的移动逻辑和指向改变逻辑,确保两者不冲突的有序进行。

        这就是文章的全部内容,希望对你有所帮助,如有错误欢迎讨论。

这篇关于链表传一级指针以及leetcode做题有感的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/911190

相关文章

go 指针接收者和值接收者的区别小结

《go指针接收者和值接收者的区别小结》在Go语言中,值接收者和指针接收者是方法定义中的两种接收者类型,本文主要介绍了go指针接收者和值接收者的区别小结,文中通过示例代码介绍的非常详细,需要的朋友们下... 目录go 指针接收者和值接收者的区别易错点辨析go 指针接收者和值接收者的区别指针接收者和值接收者的

Java Optional避免空指针异常的实现

《JavaOptional避免空指针异常的实现》空指针异常一直是困扰开发者的常见问题之一,本文主要介绍了JavaOptional避免空指针异常的实现,帮助开发者编写更健壮、可读性更高的代码,减少因... 目录一、Optional 概述二、Optional 的创建三、Optional 的常用方法四、Optio

解决java.lang.NullPointerException问题(空指针异常)

《解决java.lang.NullPointerException问题(空指针异常)》本文详细介绍了Java中的NullPointerException异常及其常见原因,包括对象引用为null、数组元... 目录Java.lang.NullPointerException(空指针异常)NullPointer

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

csu1329(双向链表)

题意:给n个盒子,编号为1到n,四个操作:1、将x盒子移到y的左边;2、将x盒子移到y的右边;3、交换x和y盒子的位置;4、将所有的盒子反过来放。 思路分析:用双向链表解决。每个操作的时间复杂度为O(1),用数组来模拟链表,下面的代码是参考刘老师的标程写的。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

建立升序链表

题目1181:遍历链表 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2744 解决:1186 题目描述: 建立一个升序链表并遍历输出。 输入: 输入的每个案例中第一行包括1个整数:n(1<=n<=1000),接下来的一行包括n个整数。 输出: 可能有多组测试数据,对于每组数据, 将n个整数建立升序链表,之后遍历链表并输出。 样例输