欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-06 10:36:19
...

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:

给定的 n 保证是有效的。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        
        if(head==nullptr || n<=0)  //  输入异常检测:链表是否为空或数值n是否小于等于0
            return NULL;
        
        ListNode* node=new ListNode(0);   //  涉及删除操作,新建头结点,以便所有节点的操作一致
        node->next=head;   //  新的头节点连接上原链表
        ListNode* h =node;   //  动态指针
        
        int len=0;   //  计算链表长度
        while(h->next){
            h=h->next;
            len++;
        }
        
        int step = len-n;  //  计算需要走的步数
        if(step<0)   //  若步数超过链表长度
            return NULL;
        
        h=node; //  动态指针归位
        for(int i=0;i<step;i++){
            h=h->next;
        }  //  动态指针走到待删除节点的前一个节点,注意是前一个节点而不是那个待删除的节点
        
        h->next=h->next->next;   //  删除给定节点
        return node->next;  // 返回头结点的的下一个节点,注意不是返回head
        
    }
};

注意的地方:输入的异常检测,删除操作新建头节点,计算链表长度,指针走到待删除节点的前一个节点