剑指Offer编程题(python)——链表
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)——链表的更多相关文章
- 剑指Offer编程题(python)——二叉树
1.重建二叉树 """ 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如输入前序遍历序列{1,2,4 ...
- 剑指Offer编程题2——替换空格
剑指Offer编程题2——替换空格 题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happ ...
- 剑指Offer编程题1——二维数组中的查找
剑指Offer编程题1---------------二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完 ...
- 剑指offer编程题Java实现——面试题5从头到尾打印链表
题目描述* 剑指offer面试题5:从尾到头打印链表 输入一个链表的头结点,从尾到头打印出每个结点的值 解决方案一:首先遍历链表的节点后打印,典型的"后进先出",可以使用栈来实现这 ...
- 剑指offer编程题Java实现——面试题13在O(1)时间内删除链表节点
题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点. 由于给定的是单向链表,正常删除链表的时间复杂度是查找链表的时间复杂度即O(n),如果要求在O(1)时间复杂度内删除节点 ...
- 剑指offer编程题66道题 36-66
36.两个链表的第一个公共节点 题目描述 输入两个链表,找出它们的第一个公共结点. 1.具有重合节点的两个链表是一个Y字性,用两个堆栈放这两个链表,从尾部开始遍历,直到遍历到最后一个重合节点. 这种算 ...
- 剑指offer编程题Java实现——面试题12相关题大数的加法、减法、乘法问题的实现
用字符串或者数组表示大数是一种很简单有效的表示方式.在打印1到最大的n为数的问题上采用的是使用数组表示大数的方式.在相关题实现任意两个整数的加法.减法.乘法的实现中,采用字符串对大数进行表示,不过在具 ...
- 剑指offer编程题Java实现——替换空格
题目描述 请实现一个函数,将一个字符串中的空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. package ...
- 剑指offer编程题Java实现——面试题6重建二叉树
题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2, ...
随机推荐
- js获取当前页面的url地址
//微信分享的时候要通过这样动态获取url传参,因为微信会对url自动加参数,所以要动态获取,不能写死url var page_url = location.href.split('#')[0];
- 【Leetcode_easy】724. Find Pivot Index
problem 724. Find Pivot Index 题意:先求出数组的总和,然后维护一个当前数组之和curSum,然后对于遍历到的位置,用总和减去当前数字,看得到的结果是否是curSum的两倍 ...
- Egret入门学习日记 --- 第十九篇(书中 8.8~8.10 节 内容)
第十九篇(书中 8.8~8.10 节 内容) 开始 8.8节. 重点: 1.类型推断. 2.类型强制转换,使其拥有代码提示功能. 3.除了TS自带的类型判断,Egret官方也提供了类型判断的方法. 操 ...
- sqlserver2005版本的mdf文件,还没有log文件,
https://www.cnblogs.com/wanglg/p/3740129.html 来自此文 仅做备忘 感谢提供信息让我处理好此问题 sqlserver mdf向上兼容附加数据库(无法打开 ...
- 汉字在unicode中的位置
在www.unicode.org中查找汉字.china找不到,后来查资料才明白,应该查CJK,为什么内? unicode这个组织吧中国日本韩国的字合并了 中日韩统一表意文字(CJK Unified ...
- 选择排序——C语言
选择排序 1.算法描述 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕(放 ...
- S03_CH11_基于TCP的QSPI Flash bin文件网络烧写
S03_CH11_基于TCP的QSPI Flash bin文件网络烧写 11.1概述 针对ZYNQ中使用QSPI BOOT的应用,将BOOT.bin文件烧写至QSPI Flash基本都是通过USB C ...
- Solr介绍 入门练习
1.1 Solr是什么 Solr是一个基于全文检索的企业级应用服务器. 全文检索:可以输入一段文字,通过分词检索数据!!(复习) 应用服务器:它是单独的服务. 1.2 Solr能做什么 它就是用于做全 ...
- javascript 写一个ajax 自动拦截,并下载数据
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
- 烧脑!CMU、北大等合著论文真的找到了神经网络的全局最优解
烧脑!CMU.北大等合著论文真的找到了神经网络的全局最优解 机器之心 已认证的官方帐号 811 人赞同了该文章 选自arXiv,作者:Simon S. Du.Jason D. Lee.Haochu ...