原题:
Given a linked list, remove the nth node from the end of list and return its head.
这个题是要求把链表的倒数第N个元素删除。。。当然只能扫描一次,其实很简单,用队列就可以,比如要删第i个,非常好,我这个队列就保存i个,没遇到一个节点我就把整个队列向前移一步,那么最后队列的头部就是这个要删除的节点喽。。。这个题关键是需要对一些特殊情况进行考虑,主要是边界问题,思路如下:
1:由于需要将第n个元素删去,因此队列的大小需要是n+1,在循环中,当队列大于n时,把头pop出去,再push进来一个,保证队列大小为n+1(如删除第一个元素时,队列大小是2),这样直接把队头指向next->next就可以了,如图1
图1
2:有这么几种情况,
1)链表只有一个元素,删除第一个,那么队列的大小只能是1,此时把head指向NULL
2)要删除链表的第一个元素,由于头部之前没有元素,直接把head指向next
上面两种情况都是删除链表的头,只需要判断队列的大小是否等于n就可以了,然后把head指向next
如图2
图2
代码如下: (36 ms)
class Solution {
public:
ListNode *removeNthFromEnd(ListNode *head, int n) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
queue<ListNode*>q;
ListNode* tail = head;
while(tail!=NULL){
//当队列的大于n,即从n+1开始pop
if(q.size()>n){
q.pop();
}
q.push(tail);
tail=tail->next;
}
//如果队列大小为n,说明要删除头结点,直接next就可以
if(q.size() == n){
head = head->next;
}
else{
q.front()->next = q.front()->next->next;
}
return head;
}
};