删除链表的倒数第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/难度中等)的主要内容,如果未能解决你的问题,请参考以下文章

两个链表的第一个公共结点(NC66/考察次数Top23/难度简单)

删除链表的倒数第N个节点

链表排序(NC70/考察次数Top44/难度简单)

删除链表的倒数第N个节点(三种方法实现)

Leetcode 19 删除链表的倒数第 N 个节点

LeetCode 第18题 删除链表的倒数第N个节点