如何利用Java输出链表中倒数第k个结点

目录
  • 前言
  • 问题描述
  • 方法一
    • 方法描述
    • 动画演示
    • 代码如下
  • 方法二
    • 方法描述
    • 动画演示
    • 代码如下
  • 总结

前言

链表是一种数据结构,和数组同级。比如,Java中我们使用的ArrayList,其实现原理是数组。而LinkedList的实现原理就是链表了。链表在进行循环遍历时效率不高,但是插入和删除时优势明显

本文主要介绍的是输出链表中倒数第k个结点,下面来一起看看详细的介绍吧

问题描述

给你一个单链表,输出倒数第k个结点,如下图链表中,输出倒数第k个结点,比如 k = 2,输出5这个结点。

方法一

方法描述

输出倒数第k个结点就是输出整数第len - k + 1个结点,len为链表的长度。

动画演示

代码如下

/**
 * Definition for singly-linked list.
 * public class Node {
 *     int val;
 *     Node next;
 *     Node() {}
 *     Node(int val) { this.val = val; }
 *     Node(int val, Node next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    //计算链表的长度
    private int size() {
        int count = 0;
        for(Node p = head;p != null;p = p.next) {
        		count++;
        }
        return count;
    }
    //返回倒数第k个结点
    public Node outputLastIndexNode(int k) {
        //链表为空
        if (head == null) {
            return null;
        }

        //链表长度
        int len = size();
        //检测k值
        if(k > len || k < 0) {
              System.out.println("k值有误!!!");
        }

      	Node p = head;
        for(int i = 0; i < len - k; i++) {
        	  p = p.next;
        }
        return p;
}

方法二

方法描述

1)定义一个q变量指向链表的第一个结点,是q变量往后移动k个结点。

2)定义一个p变量指向链表的第一个结点。

3)p变量和q变量同时循环往后移动一个结点,直到q为null。

动画演示

代码如下

/**
 * Definition for singly-linked list.
 * public class Node {
 *     int val;
 *     Node next;
 *     Node() {}
 *     Node(int val) { this.val = val; }
 *     Node(int val, Node next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    //计算链表的长度
    private int size() {
        int count = 0;
        for(Node p = head;p != null;p = p.next) {
        		count++;
        }
        return count;
    }
    //返回倒数第k个结点
    public Node outputLastIndexNode(int k) {
        //链表为空
        if (head == null) {
            return null;
        }

        //链表长度
        int len = size();
        //检测k值
        if(k > len || k < 0) {
              System.out.println("k值有误!!!");
        }

      	Node q = head;
      	//使q往后移动k个结点
      	while(k-- > 0) {
      		q = q.next;
      	}
       	Node p = head;
       	while( q != null) {
       		q = q.next;
       		p = p.next;
        }
		return p;
}

总结

到此这篇关于如何利用Java输出链表中倒数第k个结点的文章就介绍到这了,更多相关Java输出链表结点内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java输出链表倒数第k个节点

    问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } 思路1: 先遍历链表,计算其长度length; 然后计算出倒数第k个结点就是正数第length - k + 1. 最后再遍历链表,找到所求结点 时间复杂度O(2n),需要遍历两次链表 代码如下: public List

  • 如何利用Java输出链表中倒数第k个结点

    目录 前言 问题描述 方法一 方法描述 动画演示 代码如下 方法二 方法描述 动画演示 代码如下 总结 前言 链表是一种数据结构,和数组同级.比如,Java中我们使用的ArrayList,其实现原理是数组.而LinkedList的实现原理就是链表了.链表在进行循环遍历时效率不高,但是插入和删除时优势明显 本文主要介绍的是输出链表中倒数第k个结点,下面来一起看看详细的介绍吧 问题描述 给你一个单链表,输出倒数第k个结点,如下图链表中,输出倒数第k个结点,比如 k = 2,输出5这个结点. 方法一

  • C语言实现输出链表中倒数第k个节点

    本文实例展示了C++实现输出链表中倒数第k个节点的方法,分享给大家供大家参考之用. 运行本文所述实例可实现输入一个单向链表,输出该链表中倒数第k个节点. 具体实现方法如下: /* * Copyright (c) 2011 alexingcool. All Rights Reserved. */ #include <iostream> using namespace std; int array[] = {5, 7, 6, 9, 11, 10, 8}; const int size = size

  • PHP获取链表中倒数第K个节点的方法

    本文实例讲述了PHP获取链表中倒数第K个节点的方法.分享给大家供大家参考,具体如下: 问题 输入一个链表,输出该链表中倒数第k个结点. 解决思路 注意这个题目是返回节点,而不是返回值.返回值的话可以用栈来存储.返回节点则不能这样做. 设置两个指针,先让第一个指针移动k-1次.然后两个指针同时移动,当第一个指针到达最后一个节点,第二个指针就在倒数第k个节点. 注意边界:K长度可能超出链表长度,所以当第一个指针的next为空时,返回null 实现代码 <?php /*class ListNode{

  • C++解决输出链表中倒数k个结点的问题

    目录 题目描述 示例 解题思路 测试代码 补充 题目描述 输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点. 如果该链表长度小于k,请返回一个长度为 0 的链表. 数据范围:0<=n<=10^5,0<=ai<=10^9,0<=k<=10^9 要求:空间复杂度O(n),时间复杂度O(n) 进阶:空间复杂度O(1),时间复杂度O(n) 例如输入{1,2,3,4,5},2时,对应的链表结构如下图所示: 其中蓝色部分为该链表的最后2个结点,所

  • C++实现单链表删除倒数第k个节点的方法

    本文实例讲述了C++实现单链表删除倒数第k个节点的方法.分享给大家供大家参考,具体如下: 题目: 删除单链表中倒数第k个节点 解题思路及算法代码: 标尺法,定义两个指针指向链表头结点,先让一个走k步,然后两个指针同时开始走,当先走的指针走到末尾时,后走的指针指向的结点就是需要删除的结点. 单链表结构定义: typedef struct Node { int data; struct Node* next; }node, *pLinkedList; 删除倒数第K结点操作代码: //head表示头结

  • Java实现链表中元素的获取、查询和修改方法详解

    本文实例讲述了Java实现链表中元素的获取.查询和修改方法.分享给大家供大家参考,具体如下: 本节是在上一小节Java链表中添加元素的基础上继续完善我们的链表相关方法的编写,在本节中我们着重对如何获取链表中元素.查询元素以及修改元素进行学习. 一.获取元素 1.关于获取链表中元素的方法的分析 由于我们使用了虚拟头结点,而我们每次都需要从第一个真实节点开始,因此需要首先得到虚拟头结点的下一个节点是谁,然后在此基础上进行遍历工作,相关代码如下: //获取链表的第index(0-based)个位置的元

  • C++进阶练习删除链表的倒数第N个结点详解

    目录 1.链接 2.题目描述 3.解题思路 4.题解 1.链接 19. 删除链表的倒数第 N 个结点. 2.题目描述 3.解题思路 方法一 1.在对链表进行操作时,一种常用的技巧是添加一个哑节点(dummy node),它的 next指针指向链表的头节点.这样一来,我们就不需要对头节点进行特殊的判断了. 例如,在本题中,如果我们要删除节点 y,我们需要知道节点 y 的前驱节点 x,并将 x 的指针指向 y 的后继节点. 但由于头节点不存在前驱节点,因此我们需要在删除头节点时进行特殊判断.但如果我

  • python实现获取单向链表倒数第k个结点的值示例

    本文实例讲述了python实现获取单向链表倒数第k个结点的值.分享给大家供大家参考,具体如下: #初始化链表的结点 class Node(): def __init__(self,item): self.item = item self.next = None #传入头结点,获取整个链表的长度 def length(headNode): if headNode == None: return None count = 0 currentNode =headNode #尝试了一下带有环的链表,计算

  • 一篇文章带你玩转JAVA单链表

    目录 一.链表 1. 概念 2. 结构 二.单向不带头非循环链表 1. 概念及结构 2. 链表的实现 三.链表面试题 四.总结 一.链表 1. 概念 链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的 上章介绍到顺序表适合用作查询和修改,而不适合用作插入和删除.并且它增容时容易造成空间浪费.而链表则具有以下的特点 适合用作插入和删除随用随取,避免了空间的浪费不适合用作查询和修改 2. 结构 链表其实可以想象成一条被打了一些结的绳子 而实际上,链表就是由一

随机推荐