【中等】19-删除链表的倒数第N个节点
题目
Given a linked list, remove the n-th node from the end of list and return its head.
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
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.
说明:
给定的 n 保证是有效的。
Follow up:
Could you do this in one pass?
进阶:
你能尝试使用一趟扫描实现吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
解法
方法一:双指针
解题思路
定义两个指针,让前方指针先走一段距离,使得前后指针在链表上的距离为n,当前方指针到达末尾处时,后方指针的下一个位置就是要删除的位置,如果这个位置是头节点,就返回头节点的下一个节点,否则,就把后方指针的下一位定义成要删除的下一位。
代码
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *front = new ListNode(0);
front->next = head;
ListNode *back = front;
for(int i = 0; i < n+1; ++i){
front = front->next;
}
while(front != NULL){
front = front->next;
back = back->next;
}
if(back->next == head) return head->next;
back->next = back->next->next;
return head;
}
};
方法二:两次遍历
解题思路
先遍历一边记录链表大小,然后再次遍历找到要删除的位置删除即可。
代码
略
Email:1252418308@qq.com