单链表进阶OJ题精析

本文详细介绍了链表中的五个经典问题:回文链表的判断、带环链表的检测与求交点、相交链表的查找以及深度拷贝的实现,通过快慢指针和巧妙的算法优化来解决这些问题。

目录

一、回文链表

1.1 题目

1.2 题解

1.3 分析

二、带环链表I

2.1 题目

2.2 题解

2.3 分析

2.3.1为什么该思路可行?

2.3.2为什么只能快指针走两步?

三、带环链表II

3.1 题目

3.2 题解

3.3 分析

四、相交链表

4.1 题目

4.2 题解

4.3 分析

4.3.1如何判断是相交链表

4.3.2如何返回相交节点

4.4第三题的相交链表新思路

五、面试题—链表的深度拷贝

5.1 题目

5.2 题解

5.3 分析


一、回文链表

1.1 题目

牛客网原题链接:链表的回文结构_牛客题霸_牛客网

对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。

1.2 题解

class PalindromeList {
  public:
    //寻找中间节点
    struct ListNode* middleNode(struct ListNode* head) {
        struct ListNode* slow = head;
        struct ListNode* fast = head;
        while (fast != NULL && fast->next != NULL) {
            fast = fast->next->next;
            slow = slow->next;
        }
        return slow;
    }
    //逆置链表
    struct ListNode* reverseList(struct ListNode* head) {
        if (head == NULL) {
            return head;
        }
        struct ListNode* a = NULL;
        struct ListNode* b = head;
        struct ListNode* c = head->next;

        while (b) {
            b->next = a;
            a = b;
            b = c;
            if (c) {
                c = c->next;
            }
        }
        return a;
    }
    //
    bool chkPalindrome(ListNode* A) {
        struct ListNode* mid = middleNode(A);
        struct ListNode* rmid = reverseList(mid);

        while(rmid&&A)
        {
            if(rmid->val!=A->val)
            {
                return false;
            }

            rmid=rmid->next;
            A = A->next;
        }

        return true;
    }
};

1.3 分析

找到中间节点,将中间节点往后的节点进行逆置,然后从中间节点开始遍历之后的节点与头节点进行比较。

寻找中间节点使用快慢指针法,逆置链表用三指针法。具体讲解详见博主的另一篇博客:http://t.csdnimg.cn/1mZ1x

二、带环链表I

2.1 题目

LeetCode原题链接:. - 力扣(LeetCode)

给你一个链表的头节点 head ,判断链表中是否有环。如果链表中存在环 ,则返回 true 。 否则,返回 false 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值