美文网首页
Leetcode链表easy | 19. 删除链表的倒数第N个节

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

作者: Ivan_Lan | 来源:发表于2018-11-24 13:43 被阅读8次

    给定一个链表,删除链表的倒数第 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
            
        }
    };
    
    

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

    相关文章

      网友评论

          本文标题:Leetcode链表easy | 19. 删除链表的倒数第N个节

          本文链接:https://www.haomeiwen.com/subject/jjzeqqtx.html