题目描述
- 重点在于一趟扫描实现
- 简单的做法:一趟扫描长度,一趟根据长度找到结点删除
思路 & 代码
- 两种特例情况,见注释
- 思路:根据N构造两个快慢指针,两指针直接差了N个结点。由此可以在扫描一趟结束的时候,让慢指针刚好在可以解决问题的结点位置。
/**
* 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) {
// 特例1:单个的情况,直接返回null链表
if(head.next == null){
return null;
}
// 快慢指针做法
ListNode fast = head, slow = head;
// 快针先行
while(n--!=0){
fast = fast.next;
}
// 特例2:去掉头指针,此处fast=null说明要去掉的就是头指针
if(fast == null){
return head.next;
}
// 慢针开冲!
while(fast.next!=null){
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return head;
}
}
- 时间复杂度:O(n),一次遍历就完事
- 空间复杂度O(1)