文章目录
- 题目描述
- 思路 & 代码
题目描述
- 重点在于一趟扫描实现
- 简单的做法:一趟扫描长度,一趟根据长度找到结点删除
思路 & 代码
- 两种特例情况,见注释
- 思路:根据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)