• 剑指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
  • 相关阅读:
    创建表头固定,表体可滚动的GridView(转)
    正则表达式实现资料验证的技术总结 (转)
    通过样式表实现固定表头和列 (转)
    如何把string解析为int?(转)
    代码设计简单规范 (转)
    取存储过程结果集
    JS对select动态添加options操作[IE&FireFox兼容]
    多UpdatePanel
    ASP.NET页面如何引发PostBack事件 转
    asp.net 页面回传
  • 原文地址:https://www.cnblogs.com/honor260/p/14336944.html
Copyright © 2020-2023  润新知