python代码找到链表的倒数第K个节点并打印

Posted Data+Science+Insight

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python代码找到链表的倒数第K个节点并打印相关的知识,希望对你有一定的参考价值。

python代码找到链表的倒数第K个节点并打印

 

在计算机科学中,链表是数据元素的线性集合,其顺序不是由它们在内存中的物理位置决定的。相反,每个元素指向下一个元素。它是一种数据结构,由一组节点组成,这些节点共同表示一个序列。在其最基本的形式中,每个节点包含:数据和到序列中下一个节点的引用(换句话说,一个链接)。这种结构允许在迭代过程中从序列的任何位置有效地插入或删除元素。更复杂的变体添加了额外的链接,允许在任意位置更有效地插入或删除节点。链表的一个缺点是访问时间是线性的(并且很难流水线化)。更快的访问,如随机访问,是不可行的。与链表相比,数组具有更好的缓存局部性。

 

题目:给定一个链表的头节点,输出链表倒数第k个节点的值

分析:最简单的思路就按顺序访问链表节点,得到链表的长度x之后,再次从头节点出发,访问到第x-k+1个节点时,就是链表倒数第k个节点,但是这样的方法对前x-k+1个节点重复访问了两遍,效率较低。在解答链表相关题目时,设置两个甚至三个指针常用的方法,在这个题目中,可以设置两个指针,一个为a,一个为b,a先出发,在a访问了k-1个节点时,b从头节点出发,然后两个指针同时向后访问,当a访问到最后一个节点时,b访问到的就是倒数第k个节点,代码如下。

 

'''
输入一个链表,输出该链表中倒数第k个结点。
'''

'''
这道题的思路很好
如果在只希望一次遍历的情况下, 寻找倒数第k个结点, 可以设置两个指针
第一个指针先往前走k-1步, 然后从第k步开始第二个指针指向头结点
然后两个指针一起遍历
当地一个指针指向尾节点的时候, 第二个指针正好指向倒数第k个结点
推广: 寻找中间节点, 两个指针一起, 第一个指针每次走两步, 第二个指针每次走一步,  快指针指到尾部, 慢指针正好指到中间
'''

# -*- coding:utf-8 -*-
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

class Solution:
    def FindKthToTail(self, head, k):
        if head == None or k <= 0:
            return None

        pAHead = head
        pBehind = None

        for i in range(k-1):
            if pAHead.next != None:
                pAHead = pAHead.next
            else:
                return None
        pBehind = head
        while pAHead.next != None:
            pAHead = pAHead.next
            pBehind = pBehind.next
        return pBehind

node1 = ListNode(10)
node2 = ListNode(11)
node3 = ListNode(13)
node1.next = node2
node2.next = node3

S = Solution()
print(S.FindKthToTail(node1, 1).val)

Suppose we have a singly linked list, we have to check find the value of the kth last node (0-indexed). We have to solve this in single pass.

So, if the input is like node = [5,4,6,3,4,7], k = 2, then the output will be 3, as The second last (index 3) node has the value of 3.

To solve this, we will follow these steps −

  • klast := node

  • last := node

  • for i in range 0 to k, do

    • last := next of last

  • while next of last is not null, do

    • last := next of last

    • klast := next of klast

  • return value of klast

Let us see the following implementation to get better understanding −

Example

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

def make_list(elements):
   head = ListNode(elements[0])
   for element in elements[1:]:
      ptr = head
      while ptr.next:
         ptr = ptr.next
      ptr.next = ListNode(element)

   return head

class Solution:
   def solve(self, node, k):
      klast = node
      last = node
      for i in range(k):
         last = last.next
      while last.next:
         last = last.next
         klast = klast.next
      return klast.val

ob = Solution()
l1 = make_list([5,4,6,3,4,7])
print(ob.solve(l1, 2))

Input

[5,4,6,3,4,7], 2

Output

3

 

参考:找到链表的倒数第k个节点 python

参考:python 链表倒数第k个节点_leetcode链表之找出倒数第k个节点

参考:Program to find the K-th last node of a linked list in Python

参考:Find the kth-to-last element of a singly linked list

参考:linked list

 

以上是关于python代码找到链表的倒数第K个节点并打印的主要内容,如果未能解决你的问题,请参考以下文章

JZ3.从尾到头打印链表;JZ14.链表中倒数第K个节点;JZ15.反转链表;JZ16.合并两个有序链表;JZ36.两个链表的第一个公共节点;JZ55.链表中环的入口节点;JZ56.删除链表中重复节点

JZ3.从尾到头打印链表;JZ14.链表中倒数第K个节点;JZ15.反转链表;JZ16.合并两个有序链表;JZ36.两个链表的第一个公共节点;JZ55.链表中环的入口节点;JZ56.删除链表中重复节点

《剑指offer》面试题10:链表中倒数第k个节点

剑指offer 15:链表的倒数第k个节点

22 链表中倒数第k个节点(第3章 高质量的代码-代码的鲁棒性)

链表题 剑指21.删除链表的倒数第n个节点剑指22.链表的倒数第k个节点234.回文链表141.环形链表142.环形链表Ⅱ 160.相交链表 21.合并两个有序链表