给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点
不常规解(C++ 递归):
class Solution {
public:
int cur=0; // 利用递归 (先遍历完所有节点 达到倒序记录效果) 记录当前节点为倒数第几个 是n删除并返回下一个
ListNode* removeNthFromEnd(ListNode* head, int n) {
if(!head) return NULL;
head->next = removeNthFromEnd(head->next,n); // 递归访问
cur++; // 当前倒数++
if(n==cur) { // 防止内存泄漏
ListNode* p = head->next;
delete(head); // 删除当前节点
return p; // 返回当前节点下一节点
}
return head; // 返回当前节点
}
};
常规解(Java):
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
//通过快慢指针来解决,类似于你要删除中间元素的题
public ListNode removeNthFromEnd(ListNode head, int n) {
//定义一个伪节点,用于返回结果
ListNode dumpy = new ListNode(0);
dumpy.next = head;
//定义一个快指针,指向伪节点,用于遍历链表
ListNode prev = dumpy;
//定一个慢指针,
ListNode tail = dumpy;
//让快指针先移动 n 步
while(n >0){
prev = prev.next;
n--;
}
//只要快指针不指向空,就继续循环
while(prev.next !=null){
//让快慢指针同时移动
tail = tail.next;
prev = prev.next;
}
//这时慢指针移动到的位置就是,要删除节点的前一个节点
//所以只要删除当前节点的下一个节点
tail.next = tail.next.next;
//返回为指针指向的头节点
return dumpy.next;
}
}