【Leetcode】Remove Nth Node From End of List
题目描述:
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?
理解:
定义两个指针,一个在前,一个在后,同时遍历ListNode,要求是:开始遍历时fast指针要比slow指针快n步,方法是先让fast指针先移动n步,然后fast和slow再同时移动,直到移动到末尾。
这里有两种解决思路,一种直接在ListNode上进行操作,另一种使用一个stack。
解法一:
/** * 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) return NULL; ListNode* new_head = new ListNode(0); new_head->next = head; ListNode* slow = new_head, *fast = new_head; for(int i = 0;i<n;++i){ //fast先移动n fast = fast->next; } if(!fast) return new_head->next; while(fast->next){ //一起移动 fast = fast->next; slow = slow->next; } slow->next = slow->next->next; return new_head->next; } };
解法二:利用stack来解决
/** * 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) return NULL; stack<ListNode*> s; ListNode* node = head; while(node){ s.push(node); node = node->next; } for(int i = 0; i < n; ++i) { s.pop(); } if (s.empty()) { return head->next; } else { s.top()->next = s.top()->next->next; return head; } } };
完
心有猛虎,细嗅蔷薇 转载请注明:https://www.cnblogs.com/ygh1229/