LeetCode:Remove Nth Node From End of List 移除链表倒第n项

本文介绍了使用翻转链表和直接遍历两种方法来删除链表中倒数第n项的操作。通过示例代码演示了实现过程,包括链表翻转、遍历和删除节点等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、题目名称

Remove Nth Node From End of List(移除链表中倒数第n项)

2、题目地址

https://leetcode.com/problems/remove-nth-node-from-end-of-list/

3、题目内容

英文:Given a linked list, remove the nth node from the end of list and return its head.

中文:给出一个链表,删去链表中的倒数第n项,返回链表首节点

例如:

给出链表:1->2->3->4->5,给出 n = 2,返回的链表为:1->2->3->5

4、解题方法1

删去链表的倒数第n项,有两种办法,一是将链表翻转,把正数第n项删去,再将链表翻转回去。

Java代码如下:

/**
 * 功能说明:LeetCode 19 - Remove Nth Node From End
 * 开发人员:Tsybius2014
 * 开发时间:2015年8月6日
 */
public class Solution {
    
    /**
     * 删除链表中倒数第N项(从1开始计数)
     * @param head 链表首节点
     * @param n 正整数
     * @return 删除后链表首节点
     */
    public ListNode removeNthFromEnd(ListNode head, int n) {
        
        if (head == null || n <= 0) {
            return head;
        }
        
        head = reverseList(head);
        head = removeNthFromBegin(head, n);
        head = reverseList(head);
        
        return head;
    }

    /**
     * 删除链表中倒数第N项(从1开始计数)
     * @param head 链表首节点
     * @param n 正整数
     * @return 删除后链表首节点
     */
    private ListNode removeNthFromBegin(ListNode head, int n) {
        
        if (head == null || n <= 0) {
            return head;
        }
        
        System.out.println("REMOVE NTH LIST NODE: " + n);
        
        if (n == 1) {
            return head.next;
        }
        
        ListNode nodeI = head;
        ListNode nodeJ = head.next;
        n--;
        while (--n != 0) {
            nodeI = nodeI.next;
            nodeJ = nodeJ.next;
            if (nodeJ == null) {
                return head;
            }
        }
        
        nodeI.next = nodeJ.next;
        return head;
    }
    
    /**
     * 翻转链表
     * @param head 翻转前链表首节点
     * @return 翻转后链表首节点
     */
    private ListNode reverseList(ListNode head) {
        
        if (head == null || head.next == null) {
            return head;
        }

        System.out.println("REVERSE LIST");
        
        ListNode nodeReverseHead = null;
        ListNode nodeTemp;
        ListNode nodeI = head;
        while (nodeI != null) {
            nodeTemp = new ListNode(nodeI.val);
            nodeTemp.next = nodeReverseHead;
            nodeReverseHead = nodeTemp;
            nodeI = nodeI.next;
        }
        
        return nodeReverseHead;
    }
}

6、解题方法2

比解题方法1更简单的方法是,先遍历一次链表获取链表长度len,第二次遍历时遍历到第len-n项时就可以进行跳过。

Java代码如下:

/**
 * 功能说明:LeetCode 19 - Remove Nth Node From End
 * 开发人员:Tsybius2014
 * 开发时间:2015年8月6日
 */
public class Solution {
    
    /**
     * 删除链表中倒数第N项(从1开始计数)
     * @param head 链表首节点
     * @param n 正整数
     * @return 删除后链表首节点
     */
    public ListNode removeNthFromEnd(ListNode head, int n) {
        
        if (head == null || n <= 0) {
            return head;
        }
    
        //获取链表总长度
        int len = 0;
        ListNode nodeTemp = head;
        while (nodeTemp != null) {
            nodeTemp = nodeTemp.next;
            len++;
        }
        
        //删去倒数第N个点
        if (len < n) {
            return head;
        } else if (len == n) {
            return head.next;
        } else {
            int counter = len - n;
            nodeTemp = head;
            while (--counter != 0) {
                nodeTemp = nodeTemp.next;
            }
            nodeTemp.next = nodeTemp.next.next;
        }
        
        return head;
    }
}

END

转载于:https://my.oschina.net/Tsybius2014/blog/488871

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值