LeetCode19:19. 删除链表的倒数第N个节点

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

示例:

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

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

给定的 n 保证是有效的。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
第一眼看到这道题的同学一定会想到剑指offer上的链表的倒数第k个节点https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?tpId=13&tqId=11167&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

链表的倒数第k个节点的解法如下:

ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
    if(pListHead == NULL || k < 1)
        return NULL;
        ListNode*pN1 = pListHead;
        ListNode*pN2 = pListHead;
        
        for(int i = 0;i < k -1; i++)
        {
             if(pN1->next!=NULL)
            {
                pN1 = pN1->next;
            }
            else
            return NULL;
        }
        while(pN1->next!=NULL)
        {
            pN2 = pN2->next;
            pN1 = pN1->next;
        }
        return pN2;
    }

那么顺着这个思路走,我们只需要将链表的倒数第k个节点题目返回的节点删掉,代码如下

ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
    if(pListHead == NULL || k < 1)
        return NULL;
        ListNode*pN1 = pListHead;
        ListNode*pN2 = pListHead;
        
        for(int i = 0;i < k -1; i++)
        {
             if(pN1->next!=NULL)
            {
                pN1 = pN1->next;
            }
            else
            return NULL;
        }
        while(1)
        {
            if(pN1->next==NULL)
            {
                pN2->next = pN2->next->next;
            }
            pN2 = pN2->next;
        }
       
        return pListHead;
    }     

在LeetCode提交之后,出现了[1],1 不通过的问题,分析一下,即我们没有考虑空链表的情况,那么就引出了哑节点(太好用了,看代码)。

ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode *res = new ListNode(0);
        res->next = head;
        if(head == NULL)
            return res;
        ListNode *next = res;
        ListNode *res1 = res;
        for(int i = 0 ; i < n-1;i++){
            if(next != NULL){
                next = next->next;
            }
        }
        res1 = res;
        while(next->next!=NULL){
           
            next = next->next;
            if(next->next == NULL){
                 res1->next = res1->next->next;
                break;
            }
            res1= res1->next;
        }
       return res->next;
    }

直接通过,解释一下就是,先创建一个节点值为0的节点,然后把链表接到这个节点上,这样会考虑到节点为空的情况。

猜你喜欢

转载自www.cnblogs.com/jxLuTech/p/11700256.html
今日推荐