2-删除链表的第n个结点

在这里插入图片描述

  • 我的思路:
    1. 利用栈
      1. 首先,遍历链表,将链表全部结点压入栈中
      2. 要删除倒数第n个结点,就应该找到倒数第n+1个结点,所以出栈n+1次即可
/**
 * 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 dummyHead = new ListNode(1,head);
        Stack<ListNode> stack = new Stack<>();
        ListNode temp = dummyHead;
        while(temp!=null){
            stack.push(temp);
            temp = temp.next;
        }
        for(int i =1;i<=n+1;i++ ){
            temp = stack.pop();
        }
        temp.next = temp.next.next;
        return dummyHead.next;
    }
}
  • 但是效率很不理想
    在这里插入图片描述
  • 第二种思路:两次遍历
    1. 第一次遍历得出链表长度,然后就可以把倒数第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) {
        //首先,创建一个虚拟头结点
        ListNode dummyHead = new ListNode(1,head);
        ListNode temp = dummyHead;
        int size = 0;
        //获得链表长度,包含虚拟头结点
        while(temp!=null){
            size++;
            temp = temp.next;
        }
        temp = dummyHead;
        //倒数第n个,其实就是size-n+1,那么要删除第size-n+1个,就要找到size-n个
        int i =1;
        while(i!=size-n){
            temp = temp.next;
            i++;
        }
        temp.next = temp.next.next;
        return dummyHead.next;
    }
}

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值