剑指offer详解(链表)——python

Posted 一闪一闪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer详解(链表)——python相关的知识,希望对你有一定的参考价值。

3.从尾到头打印链表

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    # 返回从尾部到头部的列表值序列,例如[1,2,3]
    def printListFromTailToHead(self, listNode):
        # write code here
        if not listNode:
            return []
        l=[]
        while listNode:
            l.append(listNode.val)
            listNode=listNode.next
        return l[::-1]

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

class Solution:
    def FindKthToTail(self, head, k):
        # write code here
        if not head or k<=0: return None
        p=q=head
        t=0
        while p and t < k: # 将两个指针隔开k的距离
            p=p.next
            t+=1
        if t<k: return None # 如果倒数的个数大于链表个数则返回空
        while p!=None: # 否则将从头的链表移动到已经移动的链表移动到结尾为止
            q=q.next
            p=p.next
        return q

15.反转链表

同时也是206. 反转链表(leetcode)
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
迭代解法:

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        cur, pre = head, None
        while cur:
            temp=cur.next # 保存原链表后续的内容,不让链表断掉。temp就是原链表从第二个节点开始的一个链表
            cur.next=pre #把cur的指针直接指向pre
            pre=cur # 替换这个改造后的pre
            cur=temp # 替换这个改造后的cur
        return pre

16.合并两个排序的链表

# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    # 返回合并后列表
    def Merge(self, pHead1, pHead2):
        # write code here
        if pHead1 == None:
            return pHead2
        if pHead2 == None:
            return pHead1
        cur = ListNode(0)
        # while pHead1 and pHead2:
        if pHead1.val<= pHead2.val:
            cur=pHead1
            cur.next=self.Merge(pHead1.next, pHead2)
        else :
            cur=pHead2
            cur.next=self.Merge(pHead1, pHead2.next)
        return cur

25.复杂链表的复制

用递归去做,会很简单,但这题可能不适合python

class Solution:
    # 返回 RandomListNode
    def Clone(self, pHead):
        # write code here
        if not pHead: return None
        pCopy=RandomListNode(pHead.label) # 新建一个和pHead一样内容的RandomListNode对象
        pCopy.random=pHead.random # 一个RandomListNode需要指定的值就是random和next
        # pCopy.next=pHead.next
        pCopy.next=self.Clone(pHead.next)
        return pCopy

以上是关于剑指offer详解(链表)——python的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer从尾到头打印链表python

剑指Offer[Python版]

剑指Offer-- 翻转链表 (python版)

剑指offer python版 反转链表

剑指offer python版 删除链表中重复的结点

python剑指offer 合并两个排序的链表