Given a linked list, remove the n-th node from the end of list and return its head.
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.
Note:
Given n will always be valid.
Follow up:
Could you do this in one pass?
我的做法,又一次借用了vector,用类似动态数组的这种方式解决链表的问题确实方便,但是以后还是要少用,感觉不太好。是一种取巧的做法。
/**
* 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) {
vector<int> list;
ListNode* first = head;
int i = 0;
while(head){
list.push_back(head->val);
head = head->next;
}
if(n == list.size()){
return first->next;
}
first -> next = NULL;
ListNode *p = first;
for(int i =1;i<list.size();i++){
if(i == list.size() - n) continue;
p -> next = new ListNode(list[i]);
p = p -> next;
}
return first;
}
};
别人的做法,用双指针,很巧妙
/**
* 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 **t1 = &head, *t2 = head;
for (int i = 0; i < n ;i ++) t2 = t2 -> next;
while(t2){
t1 = &((*t1)->next);
t2 = t2 -> next;
}
*t1 = (*t1) -> next;
return head;
}
};