题目
输入一个链表,输出该链表中倒数第k个节点。比如链表是1->2->3->4->5->5,输出倒数第三个节点就是4
思路
因为单链表中每个节点的指针指向是单向的,并且还不知道这个链表有多长,笨方法是先遍历一下链表,知道链表长度后再遍历一次找到倒数第k个节点。时间复杂度O(2n),感觉有点慢。
下面使用新的方法:设置两个指针,一个指针在头结点,另一个指针在头指针前面k-1个位置,然后两个指针一起移动,直到右指针指向最后一个节点,这时的左指针一定就在倒数第k个位置。这种方法时间复杂度是O(n),还不错。
源码
# coding:utf-8
# 面试题15:链表中倒数第k个节点
class Node(object):
def __init__(self, val, p=0):
self.data = val
self.next = p
class Linklist(object):
def __init__(self):
self.head = 0
def initlist(self, data):
self.head = Node(data[0])
hNode = self.head # 链表头指针
p = self.head
for i in data[1: ]:
node = Node(i)
p.next = node
p = p.next
return hNode
def printli