166 链表倒数第n个结点

原题网址:https://www.lintcode.com/problem/nth-to-last-node-in-list/description

描述

找到单链表倒数第n个节点,保证链表中节点的最少数量为n。

您在真实的面试中是否遇到过这个题?  是

样例

给出链表 3->2->1->5->null和n = 2,返回倒数第二个节点的值1.

标签

链表

Cracking The Coding Interview

思路:首先应该清楚,若链表一共有t个结点,则正数第n个结点即倒数第t+1-n个结点。反过来也一样,倒数第n个结点是正数第t+1-n个结点

明白这点后可以使用两根指针cur 、pre来操作。其中一个指针cur走n步,指向第n个结点;

此时若cur的下一个结点为空,说明n为节点总数,直接返回头结点;

不为空,cur继续向前走一直走到尾节点,同时pre与cur同步向后,一共走了(t-n)步,此时pre指向第 1+t-n个结点(初始pre指向head),即倒数第n个结点。

AC代码:

/**
 * Definition of ListNode
 * class ListNode {
 * public:
 *     int val;
 *     ListNode *next;
 *     ListNode(int val) {
 *         this->val = val;
 *         this->next = NULL;
 *     }
 * }
 */

class Solution {
public:
    /*
     * @param head: The first node of linked list.
     * @param n: An integer
     * @return: Nth to last node of a singly linked list.
     */
    ListNode * nthToLast(ListNode * head, int n) {
        // write your code here
    if (n==0||head==NULL)
    {
        return head;
    }
    ListNode l(0);
    l.next=head;
    ListNode *cur=&l;
    ListNode *pre=head;
    for (int i=0;i<n;i++)//循环n次,cur指向第n个结点;
    {
        cur=cur->next;
    }
    while(cur->next!=NULL)//n不为结点总数(cur不为尾节点);
    {
        cur=cur->next;
        pre=pre->next;
    }//pre与cur走了(t-n)步,pre指向第t-n+1个结点,即倒数第n个结点;
    return pre;
    }
};

若初始pre指向l,pre指向第t-n个结点,即倒数第n+1个结点,最后返回pre->next。

或者初始cur与pre均指向head,则cur可循环n-1次,指向第n个结点。然后cur走到尾节点,循环t-n次,pre跟着走,指向第1+t-n个结点,即倒数第n个结点。

原文地址:https://www.cnblogs.com/Tang-tangt/p/9170345.html

时间: 2024-10-16 06:56:36

166 链表倒数第n个结点的相关文章

剑指offer (15) 链表倒数第K个结点

题目: 输入一个链表,输出该链表中倒数第k个结点 (注意:我们将链表最末一个结点记为 倒数第1个结点,也就是k从1开始计数) 解题分析: 方法一:遍历链表两次,第一次统计链表结点个数,第二次遍历就可以找到倒数第K个结点 方法二:遍历链表一次 我们使用两个指针,第一个指针从链表的头指针开始遍历向前走k-1步,第二个指针一直指向链表开头并保持不动 从第k步开始,两个指针同时向前走,这时 两个指针之间的距离一直是k-1 当第一个指针到达链表尾结点时,第二个指针指向链表倒数第k个结点 1 ListNod

算法题:求链表倒数第K个结点

说明:本文仅供学习交流,转载请标明出处,欢迎转载!  题目:给出一个单链表,返回倒数第K个结点,最后一个结点为倒数第1个. <剑指offer>上面给的解法是设置两个指针,这里记为p1.p2,先让p2走(k-1)步,然后p1.p2同时走,当p2走到最后一个结点时,p1所指向的结点就是倒数第k个结点. 我觉得按照这样的逻辑写代码反而更容易出错,因为我们需要把我两件重要的问题:(1).p2先走(k-1)步:(2)循环结束的条件是p2到达最后一个结点,即p2->next==NULL.显然这样不太

链表倒数第k个结点、链表中间节点、链表是否有环

题目描述: 输入一个链表,输出该链表中倒数第k个结点. (hint: 请务必使用链表.) 输入: 输入可能包含多个测试样例,输入以EOF结束. 对于每个测试案例,输入的第一行为两个整数n和k(0<=n<=1000, 0<=k<=1000):n代表将要输入的链表元素的个数,k代表要查询倒数第几个的元素. 输入的第二行包括n个数t(1<=t<=1000000):代表链表中的元素. 输出: 对应每个测试案例, 若有结果,输出相应的查找结果.否则,输出NULL. 样例输入: 5

剑指offer-打印链表倒数第k个结点

输入一个链表,输出该链表中倒数第k个结点. 看到这个题目,我们很容易想到一种做法,遍历两次链表,一次得到链表长度,另外一次得到倒数第k个结点. 不过要注意的是边界值的测试 链表为空 k大于链表长度 于是我的做法如下: public static ListNode FindKthToTail(ListNode head,int k) { if(head==null) { return null; } ListNode prehead=new ListNode(0); prehead.next=he

求单链表倒数第k个结点

题目: 输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针. 分析: 设置两个指针p1,p2.首先p1和p2都指向head.然后p2向前走k步,这样p1和p2之间就间隔k个节点,然后p1和p2同.... #include<iostream> #include<stdio.h> #include<stdlib.h> using namespace std; struct ListNode{ char data; ListNode* next;

《剑指offer》---输出链表倒数第k个结点

本文算法使用python3实现 1. 问题1 1.1 题目描述: ??输入一个链表,输出该链表中倒数第k个结点. ??时间限制:1s:空间限制:32768K 1.2 思路描述: ??方法一:当链表长度为 $ n $ 时,输出链表倒数第 $ k $ 个节点,即输出链表正数第 $ n-k $ 个节点.需先遍历链表计算链表长度,再从头至尾查找第 $ n-k $ 个节点,并输出. ??方法二:可以用两个指针同时指向链表头结点,第一个指针先遍历到第k个结点,此时第二个指针指向头结点,两个指针的距离为k-1

二种方法查找链表倒数第K个结点

1 #include <stdio.h> 2 #include <stdlib.h> 3 /* 4 题目:查找链表中倒数第K个结点,K>0 5 思路1:考虑 链表为空,K<链表长度,k>大于链表长度 这三种情况 6 1.链表为空,即:不存在倒数第K个结点 7 2.k>len.即:不存在倒数第K个结点. 8 3.k<len.倒数第二个结点为正数第len-1(len-2+1)个结点,倒数第三个结点为正数第len-2(len-3+1)个结点,那么倒数第K个结

LintCode 166. 链表倒数第n个节点

找到单链表倒数第n个节点,保证链表中节点的最少数量为n. 样例 给出链表 3->2->1->5->null和n = 2,返回倒数第二个节点的值1. /** * Definition of ListNode * class ListNode { * public: * int val; * ListNode *next; * ListNode(int val) { * this->val = val; * this->next = NULL; * } * } */ cla

剑指Offer13 链表倒数第K个结点

1 /************************************************************************* 2 > File Name: 13_KthNodeToTail.cpp 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年08月30日 星期二 15时32分25秒 6 ***********************************