问题背景:面临秋招,需要刷《剑指offer》了 /惨
参考链接:
https://www.cnblogs.com/kumata/p/9147077.html
https://www.cnblogs.com/yupeng/p/3413763.html
一、链表简介
链表是通过一个个节点(Node)组成的,每个节点都包含了称为数据域(value)和指针域(next)的基本单元。示意图如下:
数据域/值域:用来存放用户数据;
指针域:用来存放指向下一个元素的指针。
head: 指向第一个节点
tail: 指向最后一个节点
None: 链表中最后一个节点的指针域为None值
注:这些节点在逻辑上是相连的,但在物理内存上并不相连。
一、定义
定义节点类
class Node(object):
def __init__(self,val,p=0):
self.data = val #数据域
self.next = p #指针域
有了节点之后,定义链表类
class LinkList(object):
def __init__(self):
self.head = 0
def initlist(self,data):
self.head = Node(data[0]) #head节点
p = self.head
for i in data[1:]:
node = Node(i) #存入数据域
p.next = node #指针域
p = p.next
对这个类进行实例化
l = LinkList()
l.initlist([1,2,3,4,5]) #创建了一个链表
二、解题
以下都是我自己的解法,可能不是最优解,只是通过了测试~
1)输入一个链表,输出该链表中倒数第k个结点。
class Solution:
def FindKthToTail(self, head, k):
# write code here
arr=[] #定义一个数组
while head!=None: #当还没到遍历完
arr.append(head)
head=head.next
if k>len(arr) or k<1:
return #return 与return None相同,会结束函数
return arr[-k]
2)输入一个链表,反转链表后,输出新链表的表头。
class Solution:
# 返回ListNode
def ReverseList(self, pHead):
# write code here
if pHead==None: #空链表
return None
if pHead.next==None: #只有一个节点
return pHead
last=None
while pHead!=None:
tmp=pHead.next #暂存下一节点
pHead.next = last #当前节点指向上一节点
last = pHead #前进一格,上一节点变为当前节点
pHead = tmp #前进一格,当前节点变为下一节点
return last
3)输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
class Solution:
# 返回合并后列表
def Merge(self, pHead1, pHead2):
# write code here
result=ListNode(0) #定义一个含有100个节点的链表,存储结果
p=result
while pHead1 and pHead2: #只要遍历完其中一个链表就可以
if pHead1.val<=pHead2.val:
result.next=pHead1
pHead1=pHead1.next
elif pHead1.val>pHead2.val:
result.next=pHead2
pHead2=pHead2.next
result=result.next
if pHead1!=None: #看谁还剩下
result.next=pHead1
elif pHead2!=None:
result.next=pHead2
return p.next #这里如果写return p会把头节点也包含进去