python由1~ n(例如n =10 000 000)的n个整数建立顺序表a(采用列表表示)和带头结点的单链表h,编写一个实验程序输出分别将所有元素逆置的时间。
时间: 2023-05-24 22:07:04 浏览: 116
(Python3)数据结构–单链表之计算两数之和
由于题目要求输出逆置时间,所以我们需要计算逆置操作的时间。可以使用Python的time模块中的time()函数,记录每次逆置操作前后的时间,计算时间差即为逆置时间。
顺序表逆置操作可以使用Python中的切片操作,时间复杂度为O(n),其中n为表长。代码如下:
```python
import time
# 构建顺序表
n = 10000000
a = list(range(1, n+1))
# 逆置操作
start = time.time()
a = a[::-1]
end = time.time()
# 输出逆置时间
print("顺序表逆置时间:", end-start)
```
单链表逆置操作可以使用三个指针prev、cur、nxt,分别指向前一个节点、当前节点、下一个节点,依次遍历链表,将每个节点的next指针指向前一个节点即可。时间复杂度同样为O(n),其中n为链表长度。代码如下:
```python
import time
# 定义链表节点类
class ListNode:
def __init__(self, val=0, nxt=None):
self.val = val
self.next = nxt
# 构建单链表
n = 10000000
dummy = ListNode(0)
prev = dummy
for i in range(1, n+1):
cur = ListNode(i)
prev.next = cur
prev = cur
head = dummy.next
# 逆置操作
start = time.time()
prev = None
cur = head
while cur:
nxt = cur.next
cur.next = prev
prev = cur
cur = nxt
end = time.time()
dummy.next = prev
# 输出逆置时间
print("单链表逆置时间:", end-start)
```
这里有一个小技巧,可以使用头结点dummy来避免单链表的边界情况(即逆置操作需要特判表头节点)。具体方法是在构建链表时,先建立一个值为0的dummy节点,将其next指向第一个节点,最后再将dummy.next赋给head即可。逆置操作结束后,再将dummy.next赋给prev,得到逆置后的新链表。
阅读全文