给定一个链表,删除链表的倒数第 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的节点,然后把链表接到这个节点上,这样会考虑到节点为空的情况。
原文:https://www.cnblogs.com/jxLuTech/p/11700256.html