代码随想录算法训练营第4天|24.两两交换链表的节点、19.删除链表倒数第N个节点、 面试题 02.07. 链表相交、 142.环形链表II

24.两两交换链表的节点
19.删除链表倒数第N个节点
这个题我刚开始的做法是遍历一遍链表,然后得出链表的长度,然后在计算正向应该删除哪个位置的元素。这样的解决方法代码十分冗长,而且需要定义很多指针,很麻烦。
这个题较优的解决方案应该是使用快慢指针,整体的思路是让快指针先走N步,然后快慢指针在一起走,知道快指针fast走到链表的尾部NULL,此时,慢指针slow刚好走到目标节点的前部,即可删除指定元素,代码如下:

点击查看代码
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
    //定义虚拟头节点dummy 并初始化使其指向head
    struct ListNode* dummy = malloc(sizeof(struct ListNode));
    dummy->val = 0;
    dummy->next = head;
    //定义 fast slow 双指针
    struct ListNode* fast = head;
    struct ListNode* slow = dummy;

    for (int i = 0; i < n; ++i) {
        fast = fast->next;
    }
    while (fast) {
        fast = fast->next;
        slow = slow->next;
    }
    slow->next = slow->next->next;//删除倒数第n个节点
    head = dummy->next;
    free(dummy);//删除虚拟节点dummy
    return head;
}

这里我们需要注意对于题目不同的要求,我们要稍加修改我们的代码。比如情形一:这里是有虚拟头结点,需要删除倒数第N个节点,所以slow指向虚拟头节点,fast指向头节点,所以slow需要走到被删除节点的前一个节点,fast走到NULL,slow刚好走到slow的前一个节点。情形二:如果是需要得到倒数第N个节点的值的话,则slow需要走到该节点的头上,slow就应该再初始时指向头节点。情形三:如果无虚拟头节点,要删除倒数第N个节点,fast节点就不可走到NULL,而应走到该链表的最后一个节点。情形四:无头节点,得到倒数N的值,就需要fast走到NULL。具体怎么左,只需要再遇到时模拟一下就可以。 面试题 02.07. 链表相交 这个题其实在408的数据结构代码题中就存在,找字符串的相同后缀,首先应该知道,在两个字符串尾部对齐时,长字符串头部长出部分时不存在相同后缀的。所以,我们分别遍历一下两个链表的长度,然后让长的链表走到后缀和短字符串一样长,然后两个链表再一起走,知道走到相同后缀就可以。 142.环形链表II 这个题融合的数学的知识。需要通过计算,这个题的思想时将整条链表分成三端:从链表首部到环的入口处、从环的入口处到快慢指针的交汇处、从交汇处再到入口处,分别对应x、y、z。已知快指针一次走两步,慢指针一次走一步,问链表是否存在环。如果存在环的话,快慢指针一定会在环内会面,且此时慢指针一定并未走完一圈(因为慢指针如果进入环内。此时快指针一定也在环内的某个位置,假设慢指针走完一圈,此时快指针已经走了两圈,快指针一定可以赶得上慢指针,画图会更形象一些),所以2*(x+y) = x+y+n*(y+z),化简x = (n-1)*(y+z)+z,因为n一定为1,所以x=z,也就是说,从链表首部到环的入口的距离等于会面处到环的入口的距离。所以代码可以写出来了:
点击查看代码
ListNode *detectCycle(ListNode *head) {
    ListNode *fast = head, *slow = head;
    while (fast && fast->next) {
        // 这里判断两个指针是否相等,所以移位操作放在前面
        slow = slow->next;
        fast = fast->next->next;
        if (slow == fast) { // 相交,开始找环形入口:分别从头部和从交点出发,找到相遇的点就是环形入口
            ListNode *f = fast, *h = head;
            while (f != h) f = f->next, h = h->next;
            return h;
        }
    }
    return NULL;
}
posted @ 2026-03-05 20:33  Wdre  阅读(1)  评论(0)    收藏  举报