zoukankan      html  css  js  c++  java
  • 每日一题 为了工作 2020 03014 第十二题

    /**
    * 题目:在单链表中删除倒数第K个节点
    * 实现函数可以删除单链表中的倒数第K个节点。
    * 要求:
    * 如果链表长度为N,时间复杂度为O(N),额外空间复杂度达到O(1)。
    * 分析:
    * 1.如果链表为空或者 K值小于1, 这种情况下, 参数是无效的, 直接返回即可。
    * 除此之外, 让链表从头开始走到尾, 每移动一步, 就让 K的值减1。
    *
    * 链表: 1->2->3, K=4, 链表根本不存在倒数第4个节点
    * 走到的节点: 1 -> 2 -> 3
    * K变化为: 3 2 1
    *
    * 链表: 1->2->3, K= 3, 链表倒数第3个节点是l 节点。
    * 走到的节点: 1 -> 2 -> 3
    * K变化为: 2 I 0
    *
    * 链表: 1->2->3, K=2, 链表倒数第2个节点是2节点。
    * 走到的节点: 1 -> 2 -> 3
    * K变化为: 1 0 1
    *
    * 由以上三种情况可知, 让链表从头开始走到尾, 每移动一步, 就让 K值减 1, 当链表
    *走到结尾时, 如果 K值大于0, 说明不用调整链表, 因为链表根本没有倒数第 K个节点,
    *此时将原链表直接返回即可;
    *
    * 如果 K值等于0, 说明链表倒数第K个节点就是头节点, 此时直接返回head.next,
    *也就是原链表的第二个节点,让第二个节点作为链表的头返回即可,相当于删除头节点;
    *
    * 如果K值小于0,首先明确一点, 如果要删除链表的头节点之后的某个节点, 实际上需要
    *找到要删除节点的前一个节点, 比如: 1->2->3, 如果想删除节点2, 则需要找到节点1,
    *然后把节点1连到节点3上(1->3), 以此来达到删除节点2的目的。
    *
    * 如果K值小于0, 如何找到要删除节点的前一个节点呢?方法如下:
    *1. 重新从头节点开始走, 每移动一步, 就让 K的值加 1。
    *2. 当 K等于 0时, 移动停止, 移动到的节点就是要删除节点的前一个节点。
    *
    * 如果链表长度为N, 要删除倒数第K个节点, 很明显,倒数第K个节点的前一个节点就是
    *第 N-K个节点。在第一次遍历后, K的值变为 K-N。第二次遍历时,K的值不断加1,加到 0
    *就停止遍历, 第二次遍历当然会停到第 N-K个节点的位置。
    *
    * @author 雪瞳
    *
    */

    public class Node {
        public int value;
        public Node next;
        public Node(int data) {
            this.value=data;
        }
    }
    public class ReamoNode {
        public Node removeLastKthNode(Node head , int K) {
            if(K<0 || head == null) {
                return null;
            }
            Node cur = head;
            while(cur!=null) {
                K = K-1;
                cur = cur.next;
            }
            if(K==0) {
                head = head.next;
            }
            if(K<0) {
                cur = head;
                while(++K != 0) {
                    cur = cur.next;
                }
                //将当前节点与下一个节点的下一节点相连接
                cur.next = cur.next.next;
            }
            return head;
        }
    }
    import java.util.Random;
    import java.util.Scanner;
    
    public class testRemoveNode {
        public static void main(String[] args) {
            testRemoveNode test = new testRemoveNode();
            ReamoNode remove = new ReamoNode();
            Random rand = new Random();
            Node nodes[]=new Node[10];
            Scanner sc = new Scanner(System.in);
            System.out.print("请输入需要删除倒数第几个节点 K=");
            int K = sc.nextInt();
            
            for(int i=0;i<nodes.length;i++) {
                nodes[i]=new Node(rand.nextInt(10));
            }
            for(int i =0;i<nodes.length-1;i++) {
                nodes[i].next=nodes[i+1];
            }
            
            test.showNode(nodes[0]);
            remove.removeLastKthNode(nodes[0], K);
            test.showNode(nodes[0]);
        }
        public void showNode(Node head) {
            System.out.println("链表内的元素如下所示...");
            while(head != null) {
                System.out.print(head.value+"	");
                head = head.next;
            }
            System.out.println();
        }
    }

  • 相关阅读:
    lr 增强窗格中,如何生成调试信息?
    lr 自带的例子,如何进行关联,通过代码的函数进行实现
    lr11 录制脚本时候,无法自动启动ie,查了网上很多方法都未解决?
    loadrunner11 录制脚步不成功,在录制概要出现“No Events were detected”,浮动窗口总是显示“0 Events”,解决办法
    loadrunner11 安装及破解教程来自百度文库
    安装loadrunner11 ,出现如下错误如何解决?
    回收站数据删除了,如何进行恢复?
    网管工作方面——————打印机删除了然后开机重启他依然存在,如何解决
    Windows 不能在 本地计算机 启动 SQL Server 服务 错误代码126
    Sorry, the page you are looking for is currently unavailable. Please try again later. Nginx
  • 原文地址:https://www.cnblogs.com/walxt/p/12491721.html
Copyright © 2011-2022 走看看