您的位置:首页 > 汽车 > 时评 > 投稿平台推荐_北京网络营销公司哪家好_网站优化塔山双喜_seo查询官网

投稿平台推荐_北京网络营销公司哪家好_网站优化塔山双喜_seo查询官网

2024/11/18 1:29:50 来源:https://blog.csdn.net/qq_45031559/article/details/142602368  浏览:    关键词:投稿平台推荐_北京网络营销公司哪家好_网站优化塔山双喜_seo查询官网
投稿平台推荐_北京网络营销公司哪家好_网站优化塔山双喜_seo查询官网

题目描述:

个人题解:

由于需要找到倒数第 n 个节点,因此可以使用两个指针 first 和 second 同时对链表进行遍历,并且 first 比 second 超前 n 个节点。当 first 遍历到链表的末尾时,second 就恰好处于倒数第 n 个节点。

开始时 first 和 second 均指向头节点。然后首先使用 first 对链表进行遍历,遍历的次数为 n。此时,first 和 second 之间间隔了 n−1 个节点,即 first 比 second 超前了 n 个节点。

然后同时使用 first 和 second 对链表进行遍历。当 first 遍历到链表的末尾(即 first 为空指针)时,second 恰好指向倒数第 n 个节点。

如上方法如果能够得到的是倒数第 n 个节点的前驱节点而不是倒数第 n 个节点的话,删除操作会更加方便。因此可以考虑在初始时将 second 指向哑节点,其余的操作步骤不变。这样一来,当 first 遍历到链表的末尾时,second 的下一个节点就是需要删除的节点。

代码实现:

struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {struct ListNode* dummy = malloc(sizeof(struct ListNode));dummy->val = 0, dummy->next = head;struct ListNode* first = head;struct ListNode* second = dummy;for (int i = 0; i < n; ++i) {first = first->next;}while (first) {first = first->next;second = second->next;}second->next = second->next->next;struct ListNode* ans = dummy->next;free(dummy);return ans;
}

复杂度分析:

时间复杂度:O(L),其中 L 是链表的长度。

空间复杂度:O(1)。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com