1、从尾到头打印链表

#输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

class Solution:

    def printListFromTailToHead(self, listNode):
        # write code here
        l = []
        head = listNode
        while head:
            l.insert(0, head.val) #插入
            head = head.next
        return l

2、链表中倒数第K个结点

#输入一个链表,输出该链表中倒数第k个结点。class Solution:
    def FindKthToTail(self, head, k):
        # write code here
        l=[]
        while head!=None:
            l.append(head)
            head=head.next
        if k>len(l) or k<1:
            return
        return l[-k]

3、反转链表

#输入一个链表,反转链表后,输出新链表的表头。class Solution:
    # 返回ListNode
    def ReverseList(self, pHead):
        # write code here
        l = []
        if pHead == None:
            return
        while pHead:
            l.insert(0,pHead)
            pHead = pHead.next
        for i in range(len(l)-1):
            l[i].next = l[i+1]
        l[-1].next =None
        return l[0]

4、合并两个排序的链表

#输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。class Solution:
    def Merge(self,pHead1,pHead2):
        l1=[]
        l2=[]
        while pHead1:
            l1.append(pHead1)
            pHead1 =pHead1.next
        while pHead2:
            l2.append(pHead2)
            pHead2 =pHead2.next
        l =l1 +l2
        if l ==[]:
            return None
        for i in range(len(l)-1):
            for j in range(i+1,len(l)):
                if l[i].val>l[j].val:
                    l[i],l[j] = l[j],l[i]
        for t in range(len(l)-1):
            l[t].next= l[t+1]
        l[-1].next =None
        return l[0]

5、复制链表的复制

#输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),#返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)class RandomListNode:
def __init__(self, x):
        self.label = x
        self.next = None
        self.random = None
class Solution:
    # 返回 RandomListNode
    def Clone(self, pHead):
        # write code here
        if not pHead:
            return None
        cur = pHead
        while cur:
            tmp = RandomListNode(cur.label)
            tmp.next = cur.next
            cur.next = tmp
            cur = tmp.next
        cur = pHead
        while cur:
            tmp = cur.next
            if cur.random:
                tmp.random = cur.random.next
            cur = tmp.next
        cur = pHead
        res = pHead.next
        while cur.next:
            tmp = cur.next
            cur.next = tmp.next
            cur = tmp
        return res 

6、二叉搜索树与双向链表

#输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。
#要求不能创建任何新的结点,只能调整树中结点指针的指向。

class Solution:
    def Convert(self, pRootOfTree):
        # write code here
        if not pRootOfTree:return
        self.arr = []
        self.midTraversal(pRootOfTree)
        for i,v in enumerate(self.arr[:-1]):
            v.right = self.arr[i + 1]
            self.arr[i + 1].left = v
        return self.arr[0]

    def midTraversal(self, root):
        if not root: return
        self.midTraversal(root.left)
        self.arr.append(root)
        self.midTraversal(root.right)

7、两个链表的第一个公共结点

#输入两个链表,找出它们的第一个公共结点。class Solution:
    def FindFirstCommonNode(self, pHead1, pHead2):
        # write code here
        l1 = []
        result= []
        while pHead1:
            l1.append(pHead1.val)
            pHead1= pHead1.next
        while pHead2:
            if pHead2.val in l1:
                result.append(pHead2)
            pHead2 = pHead2.next
        if result == []:
            return None
        else:
            return result[0]

8、链表中环的入口结点

#给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。class Solution:
    def EntryNodeOfLoop(self, pHead):
        # write code here
        l = []
        while pHead:
            l.append(pHead)
            pHead = pHead.next
            if pHead in l:
                return pHead

9、删除链表中重复的结点

#在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。#例如,链表1->2->3->3->4->4->5 处理后为 1->2->5#方法:先遍历,使得链表->列表,剔除列表中重复的元素,根据新列表重构链表class Solution:
    def deleteDuplication(self, pHead):
        vals = []
        nodes =[]
        while pHead:
            vals.append(pHead.val)
            nodes.append(pHead)
            pHead = pHead.next
        vals = list(filter(lambda c: vals.count(c) == 1, vals))
        nodes = list(filter(lambda d: d.val in vals, nodes))
        if nodes== []:
            return None
        for i in range(len(nodes)-1):
            nodes[i].next = nodes[i+1]
        nodes[-1].next =None
        return nodes[0]

剑指Offer编程题(python)——链表的更多相关文章

  1. 剑指Offer编程题(python)——二叉树

    1.重建二叉树 """ 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如输入前序遍历序列{1,2,4 ...

  2. 剑指Offer编程题2——替换空格

    剑指Offer编程题2——替换空格 题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happ ...

  3. 剑指Offer编程题1——二维数组中的查找

    剑指Offer编程题1---------------二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完 ...

  4. 剑指offer编程题Java实现——面试题5从头到尾打印链表

    题目描述* 剑指offer面试题5:从尾到头打印链表 输入一个链表的头结点,从尾到头打印出每个结点的值 解决方案一:首先遍历链表的节点后打印,典型的"后进先出",可以使用栈来实现这 ...

  5. 剑指offer编程题Java实现——面试题13在O(1)时间内删除链表节点

    题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点. 由于给定的是单向链表,正常删除链表的时间复杂度是查找链表的时间复杂度即O(n),如果要求在O(1)时间复杂度内删除节点 ...

  6. 剑指offer编程题66道题 36-66

    36.两个链表的第一个公共节点 题目描述 输入两个链表,找出它们的第一个公共结点. 1.具有重合节点的两个链表是一个Y字性,用两个堆栈放这两个链表,从尾部开始遍历,直到遍历到最后一个重合节点. 这种算 ...

  7. 剑指offer编程题Java实现——面试题12相关题大数的加法、减法、乘法问题的实现

    用字符串或者数组表示大数是一种很简单有效的表示方式.在打印1到最大的n为数的问题上采用的是使用数组表示大数的方式.在相关题实现任意两个整数的加法.减法.乘法的实现中,采用字符串对大数进行表示,不过在具 ...

  8. 剑指offer编程题Java实现——替换空格

    题目描述 请实现一个函数,将一个字符串中的空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. package ...

  9. 剑指offer编程题Java实现——面试题6重建二叉树

    题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2, ...

随机推荐

  1. 一种可以避免数据迁移的分库分表scale-out扩容模式

    转自: http://jm.taobao.org/ 一种可以避免数据迁移的分库分表scale-out扩容方式 目前绝大多数应用采取的两种分库分表规则 mod方式 dayofweek系列日期方式(所有星 ...

  2. 修改NGUI 3.11 的控件 inputfileld hide input 属性bug

    1.勾选hideinput属性后,输入中文,会出现,无法显示的问题. 2.勾选hideinput属性后,密码框会出现第一个字母被吃掉的问题 解决方案:控件都不要勾选hideinput属性,代码做如下修 ...

  3. 【嵌入式硬件Esp32】ESP32学习之在windows下搭建eclipse开发环境

    一.所需工具 由于项目要用ESP32模块进行开发,折腾了下集成开发环境,现将过程记录下来,以便需要的人使用.其中需要的有交叉编译工具,esp-idf示例代码以及C/C++版的eclipse. 交叉编译 ...

  4. laravel的workflow流程插件

    原文地址:https://github.com/brexis/laravel-workflow

  5. Windows命令行更改有线本地连接IP地址及DNS的bat脚本

    有些场景需要测试网络通不通等,每次打开网络和共享中心真烦,win10右下角还进不去了,shit! 运行ncpa.cpl也打开那个界面也是费劲吧啦,索性写个bat吧!为啥要写?还不是因为懒!可以把脚本复 ...

  6. 快速配置和切换http和https

    <link href="//maze.gxrc.com/css/global.css" rel="stylesheet" type="text/ ...

  7. go timer定时器 WaitGroup用法

    参考文章: timer定时器: https://www.cnblogs.com/oxspirt/p/7107312.html WaitGroup用法: https://studygolang.com/ ...

  8. python argparse库

    argparse用法总结 https://blog.csdn.net/qq_24551305/article/details/90155858 args = parse.parse_args()par ...

  9. Java 七牛云存储与下载

    七牛云的文件上传和下载(私有空间) 1.本篇博客参考网址 https://blog.csdn.net/peaceful000/article/details/53171578 https://blog ...

  10. sql复合索引使用和注意事项

    1.定义: 单一索引: 单一索引是指索引列为一列的情况,即新建索引的语句只实施在一列上; 复合索引: 复合索引也叫组合索引: 用户可以在多个列上建立索引,这种索引叫做复合索引(组合索引). 复合索引在 ...