19. 删除链表的倒数第N个节点
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
思路:
建立结构数组,用以储存索引和指针,去掉导数第n个,哪么正序索引s的next指向下下一个node,注意当n是1和n=len两种去除结尾和开头的情况,应把指针移动到下一个和把倒数第二个的next指向nullptr。另外还有head的node数量为1和2的情况,这里我就傻傻的列出来处理了。
/**
* 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) {
struct sort_index {
int index_s;
ListNode* node;
};
ListNode* temp = new ListNode(1);
temp->next = head;
temp = temp->next;
ListNode* temp0 = new ListNode(1);
temp0->next = head;
temp0 = temp0->next;
int len = 0;
while (++len && temp0->next != nullptr){
temp0 = temp0->next;
}
if (len == 1){
return NULL;
}
if (len == 2){
if (n == 1){
temp->next = nullptr;
return head;
}
else
{
head = head->next;
return head;
}
}
sort_index SIN[len];
int s = 0;
int conti = 1;
while (conti){
if (temp->next == nullptr){
SIN[s].index_s = s;
SIN[s].node = temp;
conti = 0;
}
else{
SIN[s].index_s = s;
SIN[s].node = temp;
temp = temp->next;
s++;
}
}
if (n == 1){
SIN[s-n].node->next = nullptr;
}
else if (n == len){
head = head->next;
}
else
SIN[s-n].node->next = SIN[s-n+2].node;
return head;
}
};