给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
解法:
老实用快慢指针,快指针先走n步,然后快慢一起走,直到快指针走到最后,要注意的是可能是要删除第一个节点,这个时候可以直接返回head -> next
class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { if(!head | !head -> next) return NULL; ListNode * fast = head, *slow = head; for(int i = 0; i < n; i++){ fast = fast -> next; } if(!fast){ return head -> next; } while(fast -> next){ fast = fast -> next; slow = slow -> next; } slow -> next = slow -> next -> next; return head; } };
来源:https://www.cnblogs.com/Kanna/p/12536485.html