【刷LeetCode第N天】删除链表的倒数第N个节点

//给定一个链表,删除链表的倒数第 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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值