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

本文算法使用python3实现


1. 问题1

1.1 题目描述:

??输入一个链表,输出该链表中倒数第k个结点。
??时间限制:1s;空间限制:32768K


1.2 思路描述:

??方法一:当链表长度为 $ n $ 时,输出链表倒数第 $ k $ 个节点,即输出链表正数第 $ n-k $ 个节点。需先遍历链表计算链表长度,再从头至尾查找第 $ n-k $ 个节点,并输出。
??方法二:可以用两个指针同时指向链表头结点,第一个指针先遍历到第k个结点,此时第二个指针指向头结点,两个指针的距离为k-1。从此时起,同时后移第一个指针和第二个指针,直到第一个指针的next==None,即第一个指针指向最后一个节点的时候,第二个指针所指向的节点,就是倒数第k个结点。
?? 注意:两种方法中都需要先判断k值是否小于零或者链表是否为空,此时若是,应返回None;其次第一个指针移向第k个节点的过程中,若循环提前退出,说明链表长度小于k,应返回None


1.3 程序代码:

(1)方法一

# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def FindKthToTail(self, head, k):
        '''统计链表个数,输出第n-k个(注意是返回节点,不是返回节点的值)'''
        # 链表为空或k小于0
        if head == None or k <= 0:
            return None
        p = head
        lens = 0
        while p!= None:
            lens += 1
            p = p.next
        # k值大于链表长度
        if k > lens:
            return None
        i = 0
        q = head
        while i < lens-k:
            q = q.next
            i += 1
        return q

(2)方法二:

# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def FindKthToTail(self, head, k):
        ''' 可以用两个指针,一个指针遍历到第k个结点的时候,第二个指针再走到第一个节点,
            然后两个指针的距离始终保持k-1,这样,当第一个指针的next==NULL,也就是走到最后一个节点的时候,
            第二个指针对应的位置,就是倒数第k个结点。'''
        if head == None or k <= 0:
            return None
        p1 = head
        p1Count = 1
        p2 = head
        while p1 != None and p1Count < k:
            p1 = p1.next
            p1Count += 1
        # 当k大于链表长度时
        if p1 == None:
            return None
        while p1.next != None:
            p1 = p1.next
            p2 = p2.next
        return p2 

原文地址:https://www.cnblogs.com/lliuye/p/9062817.html

时间: 2024-10-14 00:41:58

《剑指offer》---输出链表倒数第k个结点的相关文章

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

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

【剑指offer】链表倒数第k个节点

转载请注明出处:http://blog.csdn.net/ns_code/article/details/25662121 在Cracking the Code Interview上做过了一次,这次在九度OJ上测试,AC. 题目描述: 输入一个链表,输出该链表中倒数第k个结点.(hint: 请务必使用链表.) 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为两个整数n和k(0<=n<=1000, 0<=k<=1000):n代表将要输入的链表元素的

剑指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

剑指offer-链表中倒数第 K 个结点

输入一个链表,输出该链表中倒数第k个结点. /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class Solution { public ListNode FindKthToTail(ListNode head,int k) { if(head == null){ return null; } ListNode P1 = head

剑指offer---14---链表中倒数第k个结点

https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?tpId=13&tqId=11167&rp=1&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking&tPage=1 题意 分析 方法一: 可以使用尺子 注意边界条件的判断,就是如果是空的话会怎么样就是k的长度甚至不够会怎么样. 代码

【剑指offer】链表第一个公共子结点

*思路: 先求得两个链表的长度,然后得到长度差diff,再先遍历长链表diff步后,再同时遍历两个链表并比较对象指针. 1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 this.val = val; 8 } 9 }*/ 10 public class Solution { 11 public ListNode FindFirstCommonNode(ListNo

剑指offer之链表

//剑指offer 之 链表 //面试题6 从尾到头打印链表 /***************************************************************************************** 问题描述: 输入一个链表的头节点,从尾到头反过来打印出每个节点的值 链表节点定义如下: struct ListNode{ int m_nValue; ListNode* m_pNext; }; *******************************

剑指offer (5) 链表插入删除

我们在操作链表的时候,必须注意以下事项: 1. 链表指针为NULL的情况 2. 插入删除涉及到 链表第一个节点时,需要修改 链表的第一个节点: a. 因为 c语言都是传值的,如果需要修改一个变量,就必须通过 指向该变量的指针(即该变量的地址) 例如:例如 修改 int a,则输入参数必须是 int* a, 修改a 则是: *a = b; (b为int) 我们需要修改一个指针时,就必须通过 该指针的地址,也就是 指向该指针的指针,即二级指针 例如  修改 int* a, 则输入参数必须是 int*

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

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