题目要求:
Given a linked list, remove the nth 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.
解题思路:
首先要找到这个点,然后删除
总共设计了两个函数,一个是删除单向链表中的某个节点的函数,还有一个是找到单向链表中倒数第n个节点函数。
首先,如何找到倒数第n个节点?用两个指针,第一个指针first先走n步,然后第二个指针second出发,与第一个指针同时向前,当第一个指针走到单向链表的最后,second所在的位置就是所要找的倒数第n个节点。不过上面的方法有一个漏洞,就是如果n大于链表的长度len的时候,一般题目会给出处理方法:
- n大于len直接返回错误
- n大于len,按len计算
- n大于len的时候,按照n%len计算
这里我们先假设所有的n都是不大于len的。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
struct ListNode{
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode *removeNthFromEnd(ListNode *head, int n) {
ListNode *first = head;
int step = 1;
while (step < n && first != NULL)
{
first = first->next;
step++;
}
ListNode *second = head;
while (first != NULL&&first->next != NULL)
{
second = second->next;
first = first->next;
}
return removeNode(head, second);
}
ListNode *removeNode(ListNode *head, ListNode *thenode)
{
ListNode *tmp = head;
if (head == thenode)
{
return head->next;
}
while (tmp->next != thenode)
{
tmp = tmp->next;
}
tmp->next = thenode->next;
delete thenode;
return head;
}
};