首页 > 编程语言 >代码随想录算法训练营第四天 | 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 142.环形链表II

代码随想录算法训练营第四天 | 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 142.环形链表II

时间:2023-12-02 21:34:37浏览次数:36  
标签:slow ListNode cur 随想录 fast next 链表 节点 指针

LeetCode 24. 两两交换链表中的节点

题目链接: LeetCode 24

思路: 交换结点前将cur后第一个结点和第三个结点进行保存,然后修改cur指向头节点后再修改头节点后的结点

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* dummyHead=new ListNode(0); // 设置一个虚拟头节点
        dummyHead->next=head;
        ListNode* cur=dummyHead;
        while(cur->next!=nullptr && cur->next->next!=nullptr){
            ListNode* temp1=cur->next; // 修改cur->next时会丢失结点,所以将结点进行保存
            ListNode* temp3=cur->next->next->next;

            cur->next=cur->next->next;
            cur->next->next=temp1;
            temp1->next=temp3;


            cur=cur->next->next; 
        }
        return dummyHead->next;
    }
};

 

LeetCode 19.删除链表的倒数第N个节点

题目链接: LeetCode19

思路: 使用双指针,看注释画图

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* dummyHead=new ListNode(0);
        dummyHead->next=head;
        ListNode* fast=dummyHead; // 设置快慢指针,让快慢指针指向虚拟结点
        ListNode* slow=dummyHead;

        while(n-- && fast!=nullptr){ // 让快指针多走n+1步
            fast=fast->next;
        }
        fast=fast->next; // 走了n步后再走一步

        while(fast!=nullptr){ // 当快指针指向nullptr时,slow指针正好指向n-1的位置
            fast=fast->next;
            slow=slow->next;
        }
        slow->next=slow->next->next;
        return dummyHead->next;
    }
};

 

LeetCode 142.环形链表II

题目链接: LeetCode142.环形链表II

思路: 使用快慢指针,令快指针2步走,如果说存在链表环路的话则快指针和满指针一定会相遇,不存在环路则直接返回空指针。

快慢指针相遇后,则将其中一个指针置为head,然后是他们以同样的速度进行前进,做循环判断(fast!=slow),退出循环则表示相等,直接返回从头节点开始的指针即可。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode* fast=head;
        ListNode* slow=head;
        while(true){ 
            if(fast==nullptr||fast->next==nullptr) return nullptr;  //fast指针为空指针则没有环路
            fast=fast->next->next; // 这里是已经知道链表存在环路了,令fast两步走
            slow=slow->next;
            if(fast==slow) break; // 相遇
        }
        slow=head; // 将慢指针置为头节点,然后使慢指针和快指针按一位往前走
        while(slow!=fast){ 
            fast=fast->next;
            slow=slow->next;
        }
        return slow; // 循环执行完成则表示找到入口了,直接返回slow即可
    }
};

 

标签:slow,ListNode,cur,随想录,fast,next,链表,节点,指针
From: https://www.cnblogs.com/ygmzj/p/17871948.html

相关文章

  • 第二章 链表part01
    第二章链表part01203.移除链表元素  Code:/***Definitionforsingly-linkedlist.*structListNode{*  intval;*  ListNode*next;*  ListNode():val(0),next(nullptr){}*  ListNode(intx):val(x),next(nullptr){}*  L......
  • FreeRTOS--链表
    示例源码基于FreeRTOSV9.0.0链表1概述链表一般可分为单向链表、双向链表、环形链表。FreeRTOS采用的是环形双向链表设计;单向链表只有后继节点,双向链表有后继和前驱节点;链表的目的是把元素串联,其设计方式一般有两种:将元素放置在链表结构体中;将链表结构体放置在元素中;方......
  • 代码随想录算法训练营第三天 | 203.移除链表元素 707.设计链表 206.反转链表
    LeetCode 203.移除链表元素视频链接:LeetCode203思路:根据链表的性质,将目标值对应的节点保存在一个临时节点中,再重新设置cur下一个节点,再将临时节点进行删除classSolution{public:ListNode*removeElements(ListNode*head,intval){//删除头节点......
  • 数据结构与算法之单链表-----黑马程序员(26-35)
    1.链表的概念在计算机科学中,链表是数据元素的线性集合,其每个元素都指向下一个元素,元素储存上并不连续。 创建链表如图所示和相关代码publicclassdanlianbiao{privateNodehead=null;//头部第一个结点privatestaticclassNode{//后面的每个结点intvalue;Nodene......
  • #yyds干货盘点# LeetCode程序员面试金典:奇偶链表
    题目给定单链表的头节点head,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。第一个节点的索引被认为是奇数,第二个节点的索引为偶数,以此类推。请注意,偶数组和奇数组内部的相对顺序应该与输入时保持一致。你必须在O(1)的额外空间复杂......
  • 代码随想录day4链表2
    day424.两两交换链表中的节点19.删除链表的倒数第N个节点面试题02.07.链表相交142.环形链表II总结资料来源:代码随想录(programmercarl.com)5.两两交换链表中的节点classSolution{private:/*data*/public:Solution(/*args*/);~Solution();......
  • 代码随想录day3链表1
    链表理论基础203.移除链表元素707.设计链表206.反转链表资料来源:代码随想录(programmercarl.com)1链表理论基础定义:是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。......
  • el-tree筛选时保留父节点和子节点
    watch:{filterText(val){console.log('val',val);this.$refs.tree.filter(val);}},methods://筛选filterNode(value,data,node){if(!value)returntrue;let_array=[];//这里使用数组存储只是为了存储值。......
  • 82. 删除排序链表中的重复元素 II
    82.删除排序链表中的重复元素II2021年3月25日​数据量300,数据大小[-200,200]​题意很简单,就考验你指针的使用。​两种方法桶排序暴力法思路很简单,加个100的偏移量,然后全都存下来,再倒着存进链表里返回即可。classSolution{public:ListNode*deleteDuplicates(......
  • 83. 删除排序链表中的重复元素
    83.删除排序链表中的重复元素2021年3月26日删除排序链表中的重复元素II的简化版,while套while就行为了时间,指针都不删除吗?classSolution{public:ListNode*deleteDuplicates(ListNode*head){ListNode*p=head;while(p&&p->next){w......