剑指Offer-链表-链表中倒数第k个结点

本文介绍两种链表操作算法:一种是从尾到头打印链表,通过栈结构实现链表值的逆序输出;另一种是寻找链表中倒数第k个节点,采用快慢指针技巧解决。这两种算法均具有O(N)的时间和空间复杂度。

06. 从尾到头打印链表

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

解题思路:

  • 链表特点:只能从前至后访问每个节点
  • 题目要求:倒序输出节点值

算法流程:

  • 入栈:遍历链表,各节点入栈(python使用append方法
  • 出栈:将各节点pop出栈,储存数值并返回。(python直接返回stack倒序列表

复杂度分析:

  • 空间复杂度:O(N)
  • 时间复杂度:O(N)

代码实现:

class Solution:
    def reversePrint(self, head: ListNode) -> List[int]:
        resList = []
        while head:
            resList.append(head.val)
            head = head.next
        return resList[::-1]

22.链表中倒数第k个结点

输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
示例:
在这里插入图片描述
解题思路:

  • 利用快慢指针截取输出片段:第一个指针从链表的头指针开始先向前走k步,第二个指针保持不动,从第k+1步开始,第二个指针也从头开始前进,两个指针都每次前进一步。这样,两个指针的距离都一直保持在k,当快指针(走在前面的)到达null时,慢指针(走在后面的)正好到达第k个结点。注意:要时刻留意空指针的判断。

算法流程:

  • 快指针先走k(倒数节点)步
  • 慢指针和快指针同时前进
class Solution:
    def getKthFromEnd(self, head: ListNode, k: int) -> ListNode:
        #快慢指针
        fast = slow = head
        while k>0:
            fast = fast.next
            k -= 1
        while fast != None:
            fast = fast.next
            slow = slow.next
        return slow
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值