leetcode题目例题解析(四)
Remove Nth Node From End of List
题目描述:
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从1开始),所以开始想到的是先遍历一遍,算出链表的长度,然后再第二遍删除特定的位置,但是,题目有一个小提示,就是尽量用一遍就完成,也就是再不知道链表的长度的情况下,删除倒数的第n个节点。
解题思路:
通过两次遍历的方式是最简单的,但是并不是最高效的,因为要便利两边数组,仔细想想如何通过一次遍历就实现呢? 其实这也是能够实现的,这里我们要知道,倒数第n个,也就是说跟最后一个相差n-1个,所以,我们可以通过利用这个差值,我们设定两个迭代器,一个遍历,另外一个在其前面第n个,然后跟迭代器一起增加,当迭代器遍历到结尾时,另外一个就到了我们要删除的那个了。
代码:
/**
* 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) {
ListNode* loop = head;
int count = 0;
while (count < n) {
loop = loop->next;
count++;
}
//这里要注意,如果删除的是头部,拿出来特别处理一下
if (loop == NULL) {
ListNode* temp = head->next;
delete head;//避免memory leak
return temp;
}
ListNode* target = head;//这里要一直指向我们要删除的前一个
while (loop->next) {
target = target->next;
loop = loop->next;
}
ListNode* todelete = target->next;
target->next = target->next->next;
delete todelete;
return head;
}
};
原题目链接:
https://leetcode.com/problems/remove-nth-node-from-end-of-list/description/