刷LeetCode链表之前你需要掌握的设置结点技巧C++

简介: 在c++的线性表中,如何用ListNode设置好结点呢?我们往往因为不熟悉指针和内存分配的原理,而在初学阶段不能正确的设置好结点,我总结了俩种不同情况设置结点的情况,这里引用LeetCode的几个题目为例

在c++的线性表中,如何用ListNode设置好结点呢?我们往往因为不熟悉指针和内存分配的原理,而在初学阶段不能正确的设置好结点,我总结了俩种不同情况设置结点的情况,这里引用LeetCode的几个题目为例


一、设置一个结点指向头结点head

如:ListNode * p  = head;


在这里面我们设置了一个结点指向head,我们用它可以帮助我们遍历整个链表


在c++中如果我们需要求一个链表的长度时时候就可以这样设置


剑指 Offer 22. 链表中倒数第k个节点


输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。


例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。


示例


给定一个链表: 1->2->3->4->5, 和 k = 2.


返回链表 4->5.


这一道题你在求解过程需要求链表长度 ,通过ListNode *pre = head;设置pre这个结点可以帮助遍历链表

class Solution {
public:
    ListNode* getKthFromEnd(ListNode* head, int k) {
        ListNode *pre = head;
        ListNode *p = head;
        int j = 0;
        int len = 0;
        while(pre->next){
            pre = pre->next;
            len++;
        }
        while(p && j < (len-k+1)){
            p= p->next;
            j++;
        }
        return p;
    }
};

二、单纯的设置结点

1


ListNode temp;

ListNode *ptr = &temp;


temp.next =head;


2


ListNode* temp = new ListNode (0,head);    /*设置一个新结点,这个结点值为0,temp->next=head */

ListNode* ptr = temp;                     //设置一个指针指向temp


注意1和2俩种方法是等价的 ,但是你可以看到的第一种方法temp.next用到了“ . ”,而不是"->",是因为temp前用了&符号


同时我们设置了一个指针,指向temp这个结点,所以随着指针移动temp也会随之改变(&这个符号可以将ptr 与 temp进行捆绑操作,举个例子相当于三国杀里面的“铁索连环”)


我们用LeetCode里面的题目例子来看


203. 移除链表元素

image.png

方法1

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
         ListNode temp;
         ListNode *pre = &temp;
         temp.next = head;
         while(pre->next){                //只有pre->next不为空才能进行操作
            if(pre->next->val == val)     //pre的下一个结点的值不为val的值
            pre->next= pre->next->next;   //是的话跳过这个结点
            else{
                pre = pre->next;          //否则pre往前走
            }
         }
         return temp.next;               //因为temp这个结点后继才为head,所以返回temp.next;
    }
};

方法2

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
         ListNode  *dummyHead = new ListNode(0, head);
         ListNode  *temp = dummyHead;
        while (temp->next != NULL) {
            if (temp->next->val == val) {
                temp->next = temp->next->next;
            } else {
                temp = temp->next;
            }
        }
        return dummyHead->next;
    }
};


相关文章
|
算法
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
275 1
|
6月前
|
Java C++
力扣第一道困难题《3. 无重复字符的最长子串》,c++
首先我们看到这个题是肯定有一种暴力的硬解思路的,那就是将两个vector直接链接起来,然后再排序后,直接返回中间值,这个方法实现起来还是非常容易的,
170 0
|
10月前
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
214 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
|
11月前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
本内容介绍了单链表的基本运算任务,涵盖线性表的基本概念、初始化、销毁、判定是否为空表、求长度、输出、求元素值、按元素值查找、插入和删除数据元素等操作。通过C++代码示例详细解释了顺序表和链表的实现方法,并提供了测试说明、通 - **任务描述**:实现单链表的基本运算。 - **相关知识**:包括线性表的概念、初始化、销毁、判断空表、求长度、输出、求元素值、查找、插入和删除等操作。 - **测试说明**:平台会对你编写的代码进行测试,提供测试输入和预期输出。 - **通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了测试通过后的预期输出结果。 开始你的任务吧,祝你成功!
557 5
链表的中间结点
链表的中间结点
401 57
|
存储 算法 搜索推荐
链表的中间结点
【10月更文挑战第24天】链表的中间结点是链表操作中的一个重要概念,通过快慢指针法等方法可以高效地找到它。中间结点在数据分割、平衡检测、算法应用等方面都有着重要的意义。在实际编程中,理解和掌握寻找中间结点的方法对于解决链表相关问题具有重要价值。
299 1
【数据结构OJ题】链表中倒数第k个结点
牛客题目——链表中倒数第k个结点
132 1
【数据结构OJ题】链表中倒数第k个结点
【LeetCode 09】19 删除链表的倒数第 N 个结点
【LeetCode 09】19 删除链表的倒数第 N 个结点
198 0
LeetCode第19题删除链表的倒数第 N 个结点
该文章介绍了 LeetCode 第 19 题删除链表的倒数第 N 个结点的解法,通过使用快慢双指针,先将快指针移动 n 步,然后快慢指针一起遍历,直到快指针到达链尾,从而找到倒数第 N 个结点的前一个结点进行删除,同时总结了快慢指针可减少链表遍历次数的特点。
LeetCode第19题删除链表的倒数第 N 个结点
【数据结构OJ题】链表的中间结点
力扣题目——链表的中间结点
129 0
【数据结构OJ题】链表的中间结点

热门文章

最新文章