删除链表的倒数第n个节点(NC53/考察次数Top19/难度中等)
Posted 码农指南
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了删除链表的倒数第n个节点(NC53/考察次数Top19/难度中等)相关的知识,希望对你有一定的参考价值。
描述:
给定一个链表,删除链表的倒数第 n个节点并返回链表的头指针
例如,
给出的链表为: 1→2→3→4→5, n= 2.
删除了链表的倒数第 n个节点之后,链表变为1→2→3→5.
备注:
题目保证 n一定是有效的
请给出请给出时间复杂度为O(n)的算法
示例1
输入:
{1,2},2
返回值:
{2}
(题目来自牛客网)
用C++实现如下
/**
* struct ListNode { //链表的结构,包含val和ListNode*
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
/**
*
* @param head ListNode类
* @param n int整型
* @return ListNode类
*/
ListNode* removeNthFromEnd(ListNode* head, int n) {
// write code here
//思路,首先是利用双指针方法找到链表的倒数第N个节点,然后将其干掉;
if(head == NULL)
return NULL;
ListNode *p1, *p2;
p1=p2=head;
for(int i=0; i<n; ++i) //p1先走n步
{
p1=p1->next;
}
if(!p1) //p1为空了,前面题目又提及n的给值要有意义,则
return head->next; //给的n等于链表其长度,返回结果为为去掉头部
while(p1->next) //注意此处不能越界(注意此处与求链表倒数第N个节点
{ //的区别),否则会发生段错误,由于删除时需要的
p1=p1->next; //是p2指向倒数第k的前驱,这样容易操作跳过第k节点
p2=p2->next;
}
p2->next=p2->next->next; //在倒数第k个的前驱处跳过倒数第k个节点
return head; //传入的是链表的指针,在进行上述的操作后,
} //链表已经被改动,直接返回head头部就行
};
纯手撕代码,如果觉得内容不错麻烦点个赞,后面陆续配上Top100算法题通俗易懂的讲解视频,可以花两个月时间完全掌握,进大厂不是梦,转行狗亲测!
以上是关于删除链表的倒数第n个节点(NC53/考察次数Top19/难度中等)的主要内容,如果未能解决你的问题,请参考以下文章