1、为了找出倒数第k个元素,最容易想到的办法是首先遍历一遍单链表,求出整个单链表的长度n,然后将倒数第k个,转换为正数第n-k个,接下来遍历一次就可以得到结果。但是该方法存在一个问题,即需要对链表进行两次遍历,第一次遍历用于求解单链表的长度,第二次遍历用于查找正数第n-k个元素。

# -*- coding: utf-8 -*-
"""
Created on Thu Oct  4 19:48:31 2018

@author: DELL
"""

'''
题目:
输入一个链表,输出该链表中倒数第k个结点
思路:
遍历历一次链表获得链表长度n,再次遍历链表,至n-k+1出输出
倒数第K个元素:就索引到n-K-1,因为Python具有前闭后开的特点,所以range里是n-k

'''

class listNode:
    def __init__(self,val,next):
        self.val = val
        self.next = next

class Solution:
    def Find_Kth_to_tail(self,head,K):
        if head == None or K<=0:
            return 0
        P = head
        n =1
        while p.next != None:
            p = p.next
            n = n+1
        if k>n:
            return None
        for i in range(n-k):
            head = head.next
        return head

2、显然,这种方法还可以进行优化。于是想到了第二种方法,如果从头至尾的方向从链表中的某个元素开始,遍历k个元素后刚好达到链表尾,那么该元素就是要找到的倒数第k个元素,根据这一性质,可以设计如下算法:从头节点开始,依次对链表的每一个节点元素进行这样的测试,遍历k个元素,查看是否到达链表尾,只到找到哪个倒数第k个元素。此种方法将对同一批元素进行反复多次的遍历,对于链表中的大部分元素而言,都要遍历K个元素,如果链表长度为n个的话,该算法的时间复杂度为O(kn)级,效率太低。

3、存在另外一个更高效的方式,只需要一次遍历即可查找到倒数第k个元素。由于单链表只能从头到尾依次访问链表的各个节点,因此,如果要找到链表的倒数第k个元素的话,也只能从头到尾进行遍历查找,在查找过程中,设置两个指针,让其中一个指针比另一个指针先前移k-1步,然后两个指针同时往前移动。循环直到线性的指针值为NULL时,另一个指针所指向的位置就是所要找到的位置。代码如下:

# -*- coding: utf-8 -*-
"""
Created on Thu Oct  4 19:48:31 2018

@author: DELL
"""

'''
题目:
输入一个链表,输出该链表中倒数第k个结点
思路:
设置2个指针,第一个指针走K-1步之后,在while判断时候,第一个指针再走一步,这样就相当于正好第一个指针走了K步,然后第二个指针开始从头走,这样两个指针之间始终相隔K,
当指针2走到链表结尾时,指针1的位置即倒数K个节点 

'''

class listNode:
    def __init__(self,val,next):
        self.val = val
        self.next = next

class Solution:
    def Find_Kth_to_tail(self,head,K):
        if head == None or K<=0:
            return None
        P = head
        q = head
        for i in range (K-1):
            if p.next != None:
                p = p.next
            return None
        while p.next != None:
            p = p.next
            q = q.next
        return q