IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 链表OJ练习__[回文链表相交链表环状链表随机链表]全面解析 -> 正文阅读

[数据结构与算法]链表OJ练习__[回文链表相交链表环状链表随机链表]全面解析

目录

回文链表:牛客_链表的回文结构

? 解题思路:????????图片解析:????????代码示例:

相交链表:力扣160_相交链表

? ? 解题思路:????????方法一:????????方法二 :? ? ? 方法对比:????????代码示例:

环状链表:力扣142_环状链表入口点

? ? 解题思路:????????证明过程:????????代码示例:

随机链表:力扣138_随机链表深拷贝

? ? 解题思路:?????? ?画图分析:????????代码示例:


回文链表:牛客_链表的回文结构

? 解题思路:

? ? ? ? 1.先用快慢指针找到中下节点力扣876_链表中间节点

? ? ? ? 2.反转后面部分节点力扣206_反转单链表

? ? ? ? 3.进行判断

? ? ? ?图片解析:

代码示例:

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
public:
    bool chkPalindrome(ListNode* A) {
        //找到中间节点
        if(A==NULL || A->next==NULL){
            return true;
        }
        ListNode *slow =A;
        ListNode *fast =A;
        while(fast!=NULL && fast->next!=NULL){
            fast=fast->next->next;
            slow=slow->next;
        }//slow 为中下节点
        //反转后面的链表 
       ListNode* per=NULL;
       ListNode* cur=slow;
       ListNode* next=slow->next;
       while(cur){
           cur->next=per;
           per=cur;
           cur=next;
           if(next) next=next->next;
       }//per为尾巴节点
       ListNode* head=A;
       while(per && head){
           if(per->val==head->val){
               per=per->next;
               head=head->next;
           }
           else{
               return false;
           }
       }
       return true;
       
    }
};

相交链表:力扣160_相交链表

? ? 解题思路:

方法一:

? ? ? ? 1.遍历A,B 求出链表长度A,B (假设B比A长)

????????2.B先走 (B-A) 步,使A,B同起点

? ? ? ? 3.A,B同时出则返回NULL,如果相遇,则相遇点为相交节点

? ? ? ?

方法二 :? ? ? ?????????

????????假设A B链表相交,c为相交部分,则有? ?a+c+b=b+c+a.

????????所于,我们可以将A B链表进行链接,

????????当链表A 走完a+c后 令他走向 B链表

????????当链表B走完b+c后 令他走向 A链表

????????则当A走完 a+c+b??B走完b+c+a 时他们就相遇了,返回相遇节点? ? ? ?

????????如果不相交,则走A走完A+B,B走完B+A 返回NULL

?方法对比:

? ? ? ? 方法一相对于方法二,优点在于更易于理解.并且在大多数情况下时间复制度是相同的.

? ? ? ? 而方法二的优势就在于,当链表A和B一样长的时候,他并不需要先遍历完链表长度,就可以直接得到答案.?且实现代码也更为简洁.(稍后你就会看见方法二简洁的代码,而方法一由于代码实现并非这么难,这里就不做演示)

代码示例:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    //A+C+B == B+C+A  //c表示链表的交叉部分
    struct ListNode* A=headA;
    struct ListNode* B=headB;

    while(headA!=headB){
        headA=(headA?headA->next:B);
        headB=(headB?headB->next:A);
        // if(headA){
        //     headA=headA->next;
        // }
        // else{
        //     headA=headB;
        // }
        // if(headB){
        //     headB=headB->next;
        // }
        // else{
        //     headB=headA;
        // }
    }
    return headA;
    
}

环状链表:力扣142_环状链表入口点

? ? 解题思路:

? ? ? ?1.快慢指针 fast走2步 slow走1步,如果链表有环,则必然相遇.(就像操场跑步,跑的快的必然追上跑的慢的)

????????????????????????????????????????为什么fast是走2步,而不能是走3步或4步

? ? ?? 2.如果有环,一个指针从相遇点出发,另一个指针从入口点出发,每次走一步,则必然在入口点相遇

? ? ? ?证明过程:

???代码示例:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *detectCycle(struct ListNode *head) {
    if(head==NULL||head->next==NULL)return NULL;//无环
    struct ListNode* slow=head;
    struct ListNode* fast=head;
    //寻找相遇点
    while(fast!=NULL && fast->next!=NULL){
        fast=fast->next->next;
        slow=slow->next;
        if(slow==fast){//找到相遇点
            
                while(slow!=head){ 寻找入口点
                    slow=slow->next;
                    head=head->next;
                }
                return slow; //返回入口点
            
       }
    }
    return NULL;    //无环
}

随机链表:力扣138_随机链表深拷贝

? ? 解题思路:

? ? ? ? ? 1.拷贝节点在原来的节点后面.

? ? ? ? ? 2.拷贝random节点. p->next->random=p->random->next

? ? ? ? ? 3.拆分链表? ? ??

? ? ? ? 画图分析:

?代码示例:

/**
 * Definition for a Node.
 * struct Node {
 *     int val;
 *     struct Node *next;
 *     struct Node *random;
 * };
 */

struct Node* copyRandomList(struct Node* head) {
    if(head==NULL)return head;
    struct Node* cur=head;
    //复制节点  7->7->13->13->11->11 '''->1->1->null
    while(cur){
        struct Node* copy=(struct Node*)malloc(sizeof(struct Node));
        if(copy==NULL){return NULL;}
        copy->next=cur->next;
        copy->val=cur->val;
        cur->next=copy;
        cur=copy->next;
    }
    //复制random
    cur=head;
    struct Node* copy=cur->next;
    while(cur){
        copy=cur->next;
        copy->random=(cur->random==NULL?NULL:cur->random->next);
        cur=cur->next->next;
    }
    //拆分链表
    cur=head;
    struct Node* p=cur->next;
      
    while(cur){
        copy=cur->next;
        cur->next=copy->next;
        cur=cur->next;
        copy->next=(cur==NULL?NULL:cur->next);
        
    }
    return p;
    
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 23:38:43  更:2022-04-01 23:38:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 9:40:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码