zoukankan      html  css  js  c++  java
  • 剑指offer:链表——常见的多指针协同操作:

    链表是比较经典而且常用的数据结构,我做题碰到比较多的都是单链表,而且一般有挑战性的都是单链表;单链表由于检索时只能单向进行,所以对链表中间某些对中间节点的操作就比较考验对链表指针的运用。在解决链表问题时,比较常见的操作就是两个指针一起运用,两者要么步长不同,要么相距一定的距离,这样设计就可以使得对链表中间某个值操作的非常巧妙,通常都可以把时间复杂度优化到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
  • 相关阅读:
    Qt on Android:将Qt调试信息输出到logcat中
    cheap louis vuitton outlet
    mysql经常使用查询:group by,左连接,子查询,having where
    SQLSERVER 2008 链接 到 ORACLE 11
    uva 11885
    Comet入门及最简单的Java Demo
    什么是BGP线路?什么是BGP机房?
    (LeetCode)旋转数组
    ios app 实现热更新(无需发新版本号实现app加入新功能)
    hdu 4961 Boring Sum(高效)
  • 原文地址:https://www.cnblogs.com/honor260/p/14336944.html
Copyright © 2011-2022 走看看