链表是比较经典而且常用的数据结构,我做题碰到比较多的都是单链表,而且一般有挑战性的都是单链表;单链表由于检索时只能单向进行,所以对链表中间某些对中间节点的操作就比较考验对链表指针的运用。在解决链表问题时,比较常见的操作就是两个指针一起运用,两者要么步长不同,要么相距一定的距离,这样设计就可以使得对链表中间某个值操作的非常巧妙,通常都可以把时间复杂度优化到O(N)。比如下面这道题:
题目1:输入一个链表,输出该链表中倒数第k个结点。
如果我们只用一个指针,那么就得从头走到尾,然后再从头走到倒数第k个,这样解法,如果k比较小而链表比较长,时间复杂度就可能接近2O(N),如何只遍历链表一遍就得到倒数第k个节点呢?答案就是双指针,让前一个指针比后一个指针快k-1(倒数第k个和倒数第1个,也即是表尾节点,相距离k-1个)步,那么当前一个指针走到链表尾时,后一个指针恰好到倒数第k个。编程前别忘了考虑代码鲁棒性。
python代码如下:
# -*- coding:utf-8 -*- class ListNode: def __init__(self, x): self.val = x self.next = None class Solution: def FindKthToTail(self, head, k): # write code here if head==None or k==0:#如果k为零,则返回空值 return None a=head b=head kl=k while kl-1>0: if a.next!=None: a=a.next kl-=1 else: return None#如果k的大小超过了链表长度,则返回空值 while a.next: a=a.next b=b.next return b