一、单链表反转
#!/usr/bin/python
#递归实现单链表反转
class ListNode(object):
def __init__(self,x):
self.val=x
self.next=None
def recurse(head,newhead): #递归,head为原链表的头结点,newhead为反转后链表的头结点
if head is None:
return
if head.next is None:
newhead=head
else :
newhead=recurse(head.next,newhead)
head.next.next=head
head.next=None
return newhead
if __name__ == '__main__':
head=ListNode(1) #测试代码
p1=ListNode(2) # 建立链表1->2->3->4->None
p2=ListNode(3)
p3=ListNode(4)
head.next=p1
p1.next=p2
p2.next=p3
newhead=None
p=recurse(head,newhead) #输出链表4->3->2->1->None
while p:
print(p.val)
p=p.next
二、字符串倒序
#写一个函数, 输入一个字符串, 返回倒序排列的结果
#1).利用字符串本身的翻转
str = 'abcdef'
# def string_reverse(string):
# return string[::-1]
#
# if __name__ =="__main__":
# print(str)
# print(string_reverse(str))
#2).把字符串变成列表,用列表的reverse函数
# def string_reverse2(string):
# new_str = list(string)
# new_str.reverse()
# return ''.join(new_str)
# if __name__ =="__main__":
# print(str)
# print(string_reverse2(str))
#3).新建一个列表,从后往前取
# def string_reverse3(string):
# new_str = []
# for i in range(1,len(string)+1):
# new_str.append(string[-i])
#
# return ''.join(new_str)
#
# if __name__ =="__main__":
# print(str)
# print(string_reverse3(str))
#4).利用双向列表deque中的extendleft函数
# from collections import deque
#
# def string_reverse4(string):
# d = deque()
# d.extendleft(string)
# return ''.join(d)
#
# if __name__ =="__main__":
# print(str)
# print(string_reverse4(str))
#5).递归
# def string_reverse5(string):
# if len(string)<=1:
# return string
# else:
# return string_reverse5(string[1:])+string[0]
#
# if __name__ =="__main__":
# print(str)
# print(string_reverse5(str))
三、list去重
# 1.按升序合并如下两个list, 并去除重复的元素
list1 = [2, 3, 8, 4, 9, 5, 6]
list2 = [5, 6, 10, 17, 11, 2]
list3 = list1 + list2
sort_list = sorted(list(set(list3)))
print(sort_list)
四、排序
1.冒泡排序
时间复杂度:O(n2)
#coding:utf-8
#!/usr/bin/python
def bubble_sort(list):
for i in range(len(list)-1):
for j in range(len(list)-i-1):
if list[j]>list[j+1]:
list[j],list[j+1] = list[j+1],list[j]
return list
if __name__ == '__main__':
list = [2,3,5,19,3,5,6,7]
print(bubble_sort(list))
2.快速排序
时间复杂度:O(nlogn)
版本一:
#!/usr/bin/python3
#-*- coding:utf-8 -*-
def sub_sort(lists,low,high):
key = lists[low]
while low < high:
while low < high and lists[high] >= key:
high -= 1
lists[low] = lists[high]
print("===========")
print("low=")
print(low)
print("high=")
print(high)
print(lists)
while low < high and lists[high] < key:
low += 1
lists[high] = lists[low]
print("===========")
print("low=")
print(low)
print("high=")
print(high)
print(lists)
lists[low] = key
return low
def quick_sort(array, low, high):
if low < high:
key_index = sub_sort(array,low,high)
#递归进行排序
quick_sort(array, low, key_index)
quick_sort(array, key_index+1, high)
if __name__ == "__main__":
lists = [3, 5, 4, 2, 1, 6]
print(lists)
quick_sort(lists, 0, 5)
版本二(自己写):
# coding:utf-8
# /usr/bin/python
import time
import sys
def calc_time(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(start_time)
print(end_time)
print("%s waster time is %s"%(func.__name__, end_time - start_time))
return result
return wrapper
def quick_sort(data, left, right):
if left < right:
mid = partition(data, left, right)
quick_sort(data, left, mid - 1)
quick_sort(data, mid + 1, right)
def partition(data, left, right):
tmp = data[left]
while left < right:
while left < right and data[right] >= tmp:
right -= 1
data[left] = data[right]
while left < right and data[left] <= tmp:
left += 1
data[right] = data[left]
data[left] = tmp
return left
@calc_time
def quick_sort_x(data):
return quick_sort(data, 0, len(data) - 1)
if __name__ == '__main__':
sys.setrecursionlimit(10000)
lists = list(range(1000))
#print(lists)
quick_sort_x(lists)
#print(lists)