算法-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; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
2021-07-08 《深入理解java虚拟机》第一章:概述-20210708