19. 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.
Note:
Given n will always be valid.
Try to do this in one pass.
解法一,雙指標大法:
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
if(head == NULL || n <= 0)
return head;
ListNode* fast = head;
for(int i=0; i<n && fast!=NULL; ++i)
fast = fast->next;
if(fast == NULL)
return head->next;
ListNode* slow = head;
while(fast->next != NULL){
slow = slow->next;
fast = fast->next;
}
slow->next = slow->next->next;
return head;
}
};
解法二,stack+二級指標:
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
if(head == NULL || n <= 0)
return head;
ListNode** pp = &head;
std::stack<ListNode**> st;
while(*pp != NULL){
st.push(pp);
pp = &((*pp)->next);
}
ListNode** target = NULL;
int count = 0;
while(!st.empty()){
target = st.top();
st.pop();
if(++count == n)
break;
}
*target = (*target)->next;
return head;
}
};
解法二可以通過測試用例,但是解法二沒有對N的長度是否大於連結串列長度進行判斷,不過如果N的長度=連結串列長度,解法二而*target=(*target)->next會滿足要求刪除了頭部。
解法一和二實際上都沒有處理連結串列長度K遠遠小於N的情況,實際上這種情況直接返回head就可以了。
所以解法一最完整的寫法應該是:
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
if(head == NULL || n <= 0)
return head;
ListNode* fast = head;
int i;
for(i=0; i<n && fast!=NULL; ++i)
fast = fast->next;
if(fast == NULL){
if(i == n)
return head->next;
else
return head;
}
ListNode* slow = head;
while(fast->next != NULL){
slow = slow->next;
fast = fast->next;
}
ListNode* tmp = slow->next;
slow->next = slow->next->next;
delete tmp; //加上delete
return head;
}
};
解法二就不寫了。
相關文章
- Leetcode(Python3) 19. Remove Nth Node From End of ListLeetCodePythonREM
- Leetcode 19 Remove Nth Node From End of ListLeetCodeREM
- 資料結構與演算法 | Leetcode 19. Remove Nth Node From End of List資料結構演算法LeetCodeREM
- LeetCode Remove Nth Node From End of List(019)解法總結LeetCodeREM
- 【leetcode】19. 刪除連結串列的倒數第N個節點(remove-nth-node-from-end-of-list)(雙指標)[中等]LeetCodeREM指標
- leetcode-019-刪除連結串列倒數第N個結點(Remove Nth Node From End of List)LeetCodeREM
- Remove-duplicates-from-sorted-listREM
- [LeetCode] 2487. Remove Nodes From Linked ListLeetCodeREM
- LeetCode 83. Remove Duplicates from Sorted ListLeetCodeREM
- where to start, from where the end
- LeetCode 83.Remove Duplicates from Sorted List(從已排序連結串列中除去重複) Easy/Linked ListLeetCodeREM排序
- Remove-duplicates-from-sorted-arrayREM
- Leetcode 26 Remove Duplicates from Sorted ArrayLeetCodeREM
- Java List的remove()方法陷阱JavaREM
- [leetcode]remove-duplicates-from-sorted-array-iiLeetCodeREM
- Leetcode 203. Remove Linked List ElementsLeetCodeREM
- LeetCode | 203. Remove Linked List ElementsLeetCodeREM
- [LeetCode] 80. Remove Duplicates from Sorted Array IILeetCodeREM
- 【程式碼優化】List.remove() 剖析優化REM
- for (auto it = _list.begin(); it != _list.end(); )關於在for迴圈中使用std::vector中的begin和end
- [Javascript] Find Items from the end of the JavaScript Array using at, findLast and findLastIndexJavaScriptASTIndex
- SciTech-Mathmatics-ImageProcessing-Remove the Background from an image using Python?REMPython
- MySQL報錯Slave: received end packet from server, apparent master shutdownMySqlServerAPPAST
- node中的response.write()和response.end()
- LeetCode 382 Linked List Random NodeLeetCoderandom
- Leetcode 237. Delete Node in a Linked ListLeetCodedelete
- docker image rm發生錯誤 Error response from daemon: conflict: unable to remove repository referenceDockerErrorREM
- end-to-end delay proof
- 【leetcode】26. Remove Duplicates from Sorted Array 刪除有序陣列的重複元素LeetCodeREM陣列
- 如何理解端到端(end-to-end)?
- JavaScript remove()JavaScriptREM
- nth-child和nth-of-type這倆偽類有毛關係?
- TC - front end
- DataTransferItemList.remove()REM
- Remove Element 解答REM
- JavaScript select remove()JavaScriptREM
- sort與nth_element使用
- CSS E:nth-of-type(n)CSS
- CSS E:nth-child(n)CSS