一、問題描述
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.
二、解題思路
首先定義preHead指向head,方便最後的返回;
head先走n步(因爲初始時head就指向了1,所以只需要走n-1步即可),之後head的作用其實相當於尾指針了。主要用來判斷鏈表是否走到了結尾。然後preN和head同時移動。當head移動到尾部時。此時,preN指向n結點的前一個位置。最後,只需要改變preN的next爲n的next即可。
三、代碼實現
/**
* 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(head == NULL || n==0) return head;
ListNode* preHead = new ListNode(0);
preHead->next = head;
//preN永遠是N的前一個結點
ListNode* preN = preHead;
int i = 1;
while(i < n) {
head = head->next;
i++;
}
while(head->next != NULL){
preN = preN->next;
head = head->next;
}
//經過while後,preN指向的就是結點3,所以只需要將3指向5就可以了
preN->next = preN->next->next;
return preHead->next;
}
};