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
给定一个链表,要求去除倒数第n个节点,然后返回新的链表
思路:要去除节点,首先要找到待删除节点的前一个节点。由于是倒数,考虑从后往前挪是行不通的,因此需要换位思考,从前往后移动n-k个节点是个办法,但是n不知道,需要遍历一次才知道n。从前往后挪动n-k的时候,考虑构造两个指针,一个先挪到k的位置,然后另一个指针从头开始,两个指针同时挪动直到先挪的指针到链表末尾。要记录倒数第k个节点的头一个节点,以便删除。删除记得释放内存,并注意边界条件。
ListNode* removeNthFromEnd(ListNode* head, int n) {
if (head == NULL)
return NULL;
ListNode* p = head;//指针p先走n步
while (n--)
{
p = p->next;
}
if(p == NULL) //p走到了null
{
ListNode* tmp = head->next;
free(head); //释放内存,对于在线编程而言,是delete还是free值得思考
}
ListNode *q = head;
ListNode *tmp = head;
while(p != NULL)
{
tmp = q;//记录倒数第k+1个节点
q = q->next;
p = p->next;
}
tmp->next = q->next; //删除节点,改变指针的指向
free(q); //q为待删除节点,记得释放内存
return head;
}