基础算法(Leetcode)刻意练习第十一天——链表

引言

由 “LSGO软件技术团队” 组织的 “基础算法刻意练习” 采用分类别练习的模式,即选择了五个知识点(数组、链表、字符串、树、贪心算法),每个知识点选择了 三个简单、两个中等、一个困难 等级的题目,共计三十道题,利用三十天的时间完成这组刻意练习。以下是我的每日打卡记录:


Task11.删除链表的倒数第N个节点

  • Leecode第19题

  • 难度:中等

  • 题目概述:

      给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
    
      示例:
      给定一个链表: 1->2->3->4->5, 和 n = 2.
      当删除了倒数第二个节点后,链表变为 1->2->3->5.
      
      说明:
      给定的 n 保证是有效的。
    
      进阶:
      你能尝试使用一趟扫描实现吗?
    

题解思路


  • 1.两次遍历

第一次遍历获得链表的长度 len,第二次遍历找到需要删除的节点。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode result=new ListNode(-1);
        result.next=head;
        ListNode cur=head;
        int len=0;
        while(cur!=null){
            len++;
            cur=cur.next;
        }
        cur=result;
        for(int i=0;i<len-n;i++)
            cur=cur.next;
        cur.next=cur.next.next;
        return result.next;
    }
}

提交记录

emm


  • 2.一次遍历

利用两个间隔为 n 的指针,一起移动,当后一个指针到达末尾时,前一个指针正好是要删除的节点。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode previous=new ListNode(0);
        previous.next=head;
        ListNode current=head;
        for(int i=1;current!=null;i++){
            current=current.next;
            if(i>n)
                previous=previous.next;
        }
        if(previous.next==head)
            head=head.next;
        else
            previous.next=previous.next.next;
        return head;
    }
}

提交记录

果真要快了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值