剑指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, ...
随机推荐
- ubuntu 18.04安装jdk8和eclipse
JDK8的安装 1.安装ppa sudo add-apt-repository ppa:webupd8team/java sudo apt-get update 2.安装JDK sudo apt-ge ...
- 【Leetcode_easy】599. Minimum Index Sum of Two Lists
problem 599. Minimum Index Sum of Two Lists 题意:给出两个字符串数组,找到坐标位置之和最小的相同的字符串. 计算两个的坐标之和,如果与最小坐标和sum相同, ...
- [c++]C++关键字之friend
re 1. C++关键字之friend; end 希望大家能把自己的所学和他人一起分享,不要去鄙视别人索取时的贪婪,因为最应该被鄙视的是不肯分享时的吝啬.---GOOD---
- 红绿灯 promise和原始方式实现
Promise 方式 async+await function sleep(duration){ return new Promise(function(resolve){ setTimeout(re ...
- c# 结构体struct注意事项
c# 结构struct注意事项 1,不能定义无参构造函数,因为隐式的默认无参构造函数不能被重写 2,当为某个结构编写带有参数的构造函数时,必须显式初始化所有成员,否则编译不过. 3,不允许在结构的实例 ...
- 电脑磁盘分区助手:DiskGenius磁盘管理与数据恢复软件
百度搜索DiskGenius自行下载
- Edit Delete Mysql的主从复制
参考博客 https://www.cnblogs.com/zhoujie/p/mysql1.html Mysql的主从复制至少是需要两个Mysql的服务,当然Mysql的服务是可以分布在不同的服务器上 ...
- linux系统中RAID5磁盘冗余阵列配置(5块磁盘)
RAID5:需要至少三块(含)硬盘,兼顾存储性能.数据安全和储存成本. 如图所示”parity”块中保存的是其他硬盘数据的奇偶校验信息(并非其他硬盘的数据),以数据的奇偶校验信息来保证数据的安全,RA ...
- Django导出数据为Excel,调用浏览器下载
1. 环境 Django (2.1.10) + Python3.6 + xlwt (1.3.0) 操作系统使用的为:Windows 7 2. 接口代码 def now_export(request): ...
- WUSTOJ 1276: 峰峰不搞G(Java)
1276: 峰峰不搞G 题目 给 n 数量的油漆,写出最大的数,每个数对应有油漆的花费.更多内容点击标题. 分析 我读完题,就想到用动态规划,结果是Time Limit Exceed.然后看了 ...