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

2018-11-24  本文已影响8人  Ivan_Lan

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

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

上一篇 下一篇

猜你喜欢

热点阅读