算法-23在链表中删除倒数第K个节点

描述

给出一个单链表,返回删除单链表的倒数第 K 个节点后的链表。

输入描述:

第一行输入两个正整数 n, K ,分别表示链表的长度和要删除单链表倒数第K个节点。 接下来一行有 n 个整数,依次表示单链表中的各个节点的节点值val。

输出描述:

在给定的函数内返回删除倒数第K个节点后的链表的头指针。

示例1

输入:
5 4
1 2 3 4 5

输出:
1 3 4 5

思路

 1.如果链表为空或者K小于1,参数时无效的,直接返回即可;

 2.让链表从头开始走到尾,每移动一步,就让K的值减1;

         让链表从头开始走到尾,每移动一步,就让K值减1,当链表走到结尾时,有三种情况,K的变化为:1  0  -1:

        (1) 如果K值大于0,说明不用调整链表,因为链表根本没有倒数第K个节点,此时直接将原链表返回即可;

        (2) 如果K值等于0,说明链表倒数第K个节点就是头节点,此时直接返回head.next,也就是原链表的第二个节点,让第二个节点作为链表的头返回即可,相当于删除头节点;

        (3) 如果K值小于0,要如何找到删除节点的前一个节点呢?方法如下:

               1):重新从头节点开始走,每移动一步,就让K的值加1;

               2):当K等于0时,停止移动,移动到的节点就是要删除节点的前一个节点。

        这样做很好理解的,因为如果链表长度为N,要删除倒数第K个节点,很明显,倒数K个节点的前一个节点就是N-K个节点。在第一次遍历后,K的值变为K-N。第二次遍历时,K的值不断加1,加到0就停止遍历,第二次遍历当然会停到第N-K个节点的位置。

 

代码如下:

复制代码
import java.util.Scanner;

public class Main {
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int k = sc.nextInt();
        
        if(n<k) {
            System.out.println("链表根本没有倒数第K个节点");
        }
        
        Node node = new Node(sc.nextInt());
        Node head = node;
        for(int i=1;i<n;i++) {
            Node next = new Node(sc.nextInt());
            node.next = next;
            node = next;
        }
        Node result = removeLastKtheNode(head,k);
        StringBuilder sb = new StringBuilder();
        while(result != null) {
            sb.append(result.value).append(" ");
            result = result.next;
        }
        System.out.println(sb.toString().trim());
    }
    
    
    public static Node removeLastKtheNode(Node head,int lastKth) {
        if(head == null || lastKth<1) {
            return head;
        }
        Node cur = head;
        while(cur != null) {
            lastKth--;
            cur = cur.next;
        }
        if(lastKth == 0) {
            head = head.next;
        }
        if(lastKth<0) {
            cur = head;
            while(++lastKth != 0) {
                cur = cur.next;
            }
            cur.next = cur.next.next;
        }
        return head;
    }
}

class Node {
    public int value;
    public Node next;
    
    public Node(int data) {
        this.value = data;
    }
}
复制代码

 

posted @   思凡念真  阅读(74)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
历史上的今天:
2021-07-08 《深入理解java虚拟机》第一章:概述-20210708
点击右上角即可分享
微信分享提示