题目:
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5. 说明: 给定的 n 保证是有效的。 进阶: 你能尝试使用一趟扫描实现吗?
1。解题思路:
快慢指针实现即可。快指针指向第N个节点。慢指针指向第一个节点,然后两个指针依次指向下一个节点,直到慢指针到达链表的末尾。
/** * 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 * slow = head; ListNode * fast = head; ListNode * target = head; if(n <= 0){ return head; } for(int i = 0;i < n;++i){ fast = fast->next; } if(fast == NULL){ target = head->next; free(head); return target; } while(fast->next){ fast = fast->next; slow = slow->next; } target = slow->next; slow->next = slow->next->next; free(target); return head; } };