https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/submissions/
给定一个链表,删除链表的倒数第 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 == NULL || n <= 0) {
return head;
}
ListNode *p = head;
int len = 0;
// 求总长度
while (p != NULL) {
p = p->next;
len++;
}
p = head;
if (n > len) {
return p;
}
if (n == len) {
p = p->next;
return p;
}
int k = len - n - 1;
while (k) {
p = p->next;
k--;
}
p->next = p->next->next;
p = head;
return p;
}
};
解法二:遍历一遍存节点为数组,然后删除对应节点
/**
* 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 == NULL || n <= 0) {
return head;
}
ListNode *p = head;
int len = 0;
vector <ListNode*> vpl;
// 求总长度
while (p != NULL) {
vpl.push_back(p);
p = p->next;
len++;
}
p = head;
if (n > len) {
return p;
} else if (n == len) {
p = p->next;
} else {
int i = len - n - 1;
vpl[i]->next = vpl[i]->next->next;
}
return p;
}
};