问题描述
删除倒数第n个节点。
Given a linked list, remove the n th node from the end of list and return its head.
For 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.
问题分析
①新建一个dummy节点,将链表挂在dummy后,并令链表头head = dummy;
②front和back指针分别赋值为head,并使front先走n步;
③两指针向后走,当front指向链表尾时,back->next指向的节点即为要删的节点;
④令back->next = back->next->next,返回head->next即可。
ps:
将链表头挂在dummy的后面是为了处理要删除的节点时头结点的情况。代码实现
/**
* 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(NULL == head || n <= 0)
return head;
ListNode *dummy = new ListNode(0);
dummy->next = head;
head = dummy;
ListNode *front = head;//走在前面的指针,领先走n步
ListNode *back = head;//走在后面
while(n--)
{
front = front->next;
}
while(front->next)
{
front = front->next;
back = back->next;
}//此时back->next指向要删除的节点
back->next = back->next->next;//跳过下一个要删除的节点
return head->next;
}
};
- 另一种做法
ListNode *removeNthFromEnd(ListNode *head, int n) {
if(NULL == head || n <= 0)
return head;
//先走n步,若此时为NULL,则要删除的是头结点
ListNode *front = head;
while(n--)
{
front = front->next;
}
if(NULL == front)
return head->next;
ListNode *back = head;
while(front->next)
{
front = front->next;
back = back->next;
}
back->next = back->next->next;
return head;
}