https://leetcode.com/problems/remove-nth-node-from-end-of-list/
Given a linked list, remove the n-th node from the end of list and return its head.
Example:
Given linked list: 1->2->3->4->5, and n = 2. After removing the second node from the end, the linked list becomes 1->2->3->5.Note:
Given n will always be valid.
Follow up:
Could you do this in one pass?
原本想直接用间隔指针遍历+原地删除节点,但是没法处理n == 1(删除最后一个节点)的情况。
因此改为传统的删除后一节点的方法,需要n+1的间隔,这就导致当n == link.size的时候会发生空指针错误,所以人为添加头节点。
/**
* 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) {
ListNode *fake_head = new ListNode(0);
fake_head->next = head;
ListNode *L1 = fake_head, *L2 = fake_head;
for(int i = 0; i < n+1; ++i){
L1 = L1->next;
}
while(L1 != NULL){
L1 = L1->next;
L2 = L2->next;
}
L2->next = L2->next->next;
return fake_head->next;
//试图使用原地删除方法,针对末尾节点的情况无法处理
// ListNode *L1 = head, *L2 = head;
// for(int i = 0; i < n; ++i){ //不能走n+1步
// L1 = L1->next;
// }
// while(L1 != NULL){
// L1 = L1->next;
// L2 = L2->next;
// }
// L2->val = L2->next->val;
// L2->next = L2->next->next;
// return head;
}
};