//给定一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
//
//
//
// 示例 1:
//
//
//
//
//输入:head = [1,2,3,4,5], n = 2
//输出:[1,2,3,5]
//
//
// 示例 2:
//
//
//输入:head = [1], n = 1
//输出:[]
//
//
// 示例 3:
//
//
//输入:head = [1,2], n = 1
//输出:[1]
//
//
//
//
// 提示:
//
//
// 链表中结点的数目为 sz
// 1 <= sz <= 30
// 0 <= Node.val <= 100
// 1 <= n <= sz
//
//
//
//
// 进阶:能尝试使用一趟扫描实现吗?
//
//
//
// 注意:本题与主站 19 题相同: https://leetcode-cn.com/problems/remove-nth-node-from-end-of
//-list/
// Related Topics 链表 双指针
// 👍 5 👎 0
//leetcode submit region begin(Prohibit modification and deletion)
/**
* 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) {
return process2(head, n);
}
/*
解法1:暴力破解
笨方法:先将链表反转,顺序第N个移除掉,然后再反转回来。时间复杂度是O(N),额外空间复杂度是O(1),缺点,3次扫描
*/
public ListNode process1(ListNode head, int n){
return null;
}
/*
解法2:一次遍历
分析,删除倒数第N个节点,则这个节点(node)距离末端有N-1个节点。
3个指针
pre 指向node的前一个
cur 指向当前node、
tail 指向距离node的后n-1位置的节点,当tail.next=null时,说明以及到了末端
此时pre.next = pre.next.next即可
如果移除的是头节点(pre==null),则返回node.next
*/
public ListNode process2(ListNode head,int n){
if (head==null)
return head;
ListNode pre = null;
ListNode cur = head;
ListNode tail = head;
for (int i=0;i<n-1;i++){ //处理tail指针,先让它走n-1步
tail = tail.next;
if (cur==null){ //如果它走不了这么多步,就说明题目给的n不合理,超过了链表的长度
return null;
}
}
while (tail.next!=null){ //tail走到链表末端时,跳出循环
pre = cur;
cur = cur.next;
tail = tail.next;
}
//移除当前节点
if (pre==null){
ListNode newHead = cur.next;
cur.next = null;
return newHead;
}
pre.next = pre.next.next;
return head;
}
}
//leetcode submit region end(Prohibit modification and deletion)
【刷LeetCode第N天】删除链表的倒数第N个节点
最新推荐文章于 2024-05-20 20:08:58 发布