单链表反转 | 不合法的路径地址转变为合法路径
今天参加一个云服务企业的视频面试的时候,面试官一上来就要考验基本功。然后就出了两个算法题:一个链表反转;一个求合法路径地址。面试的时候答的不够好,所以现在总结一下这两个笔试题。
1. python单链表反转
单链表结构
单链表反转问题就不细说,网上能找到很多。使用三个变量L、M、R互相赋值迭代,并建立指向关系,从而实现单链表的反转。直接上代码
class Node(object):
def __init__(self, data, next=None):
self.val = data
self.next = next
def reversef(head):
if head == None:
return None
L, M, R = Node, Node, head
while R.next != None:
L = M
M = R
R = R.next
M.next = L
R.next = M
return R
if __name__ == '__main__':
l1 = Node(3)
l1.next = Node(2)
l1.next.next = Node(1)
l1.next.next.next = Node(9)
l = reversef(l1)
print (l.val, l.next.val, l.next.next.val, l.next.next.next.val)
输出:
(9, 1, 2, 3)
Process finished with exit code 0
2. 合法路径问题
问题:一个合法的路径中最后一个字符不能是’/’,且子文件与父文件之间只能有一个’/’,例如:/home/user/my/ae。
设计一个算法,将输入的路径字符串转变为合法路径并输出。
例子:
- 输入: /home//user/myae
输出: /home/user/my/ae- 输入: /home///opt//sdfe/
输出: /home/opt/sdfe
代码如下:
def lujing(s):
strs = s.split('/')
strt = list(filter(None,strs))
print('/'+'/'.join(strt))
if __name__ == '__main__':
s='ad/asdf//asdf///asdf//safd/ae///ead/'
lujing(s)
/ad/asdf/asdf/asdf/safd/ae/ead
Process finished with exit code 0
思路:
- 通过split()方法将字符串用 '/ ’ 进行分割
- 删除分割后得到的list表中的空元素 ’ ’
[‘ad’, ‘asdf’, ‘’, ‘asdf’, ‘’, ‘’, ‘asdf’, ‘’, ‘safd’, ‘ae’, ‘’, ‘’, ‘ead’, ‘’] - 通过join()方法将list表中的元素通过 '/ ’ 进行合并
注:filter() 函数是python的内置函数,用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。