原创

力扣:19. 删除链表的倒数第 N 个结点

温馨提示:
本文最后更新于 2024年09月19日,已超过 218 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我
package intermediate;
/**
 * 题目:19. 删除链表的倒数第 N 个结点
 * 难度:中等
 * 需求:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
 * 原题链接: https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/
 */
public class removeLinkNodeFromEnd {
    /**
     *解题思路:先遍历一遍链表从而获取链表的长度,随后使用连边长度减去要删除的倒数第n个结点
     * 从而获取正序的节点下标,然后再记录一下此次遍历时的下标,当次下标(遍历时的下标)和
     * 前面计算出来的下标(要删除元素的下标)一致时直接删除该下标即可。
     */
    public static ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode linkNode = head;
        //获取链表长度
        int linkLen = getNumberOfNodes(head);
        int index2 = linkLen - n;
        //如果长度为1获取需要删除的是头节点直接返回下一个节点即可
        if (linkLen==1||index2==0) return head.next;
        //记录当前下标
        int index = 1;
        //遍历如果当前下标符合要删除的下标值则直接删除阶段,否则继续遍历链表
        while (linkNode.next != null) {
            if (index==index2){
                linkNode.next = linkNode.next.next;
                index++;
            }else{
                linkNode = linkNode.next;
                index++;
            }
        }
        return head;
    }
    //统计链表长度
    public static int getNumberOfNodes(ListNode head) {
        int linkLen = 1;
        ListNode linkNode = head;
        while (linkNode.next != null) {
            linkNode = linkNode.next;
            linkLen++;
        }
        return linkLen;
    }

    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;
        }
    }
}
正文到此结束