如何实现链表的逆序

如何实现链表的逆序

1 单向链表的反转

问题描述:

给定一个带头结点的单链表,请将其逆序。即如果单链表原来为head -->1 --> 2 --> 3 --> 4 --> 5,那么逆序后变为head --> 5 --> 4 --> 3 --> 2 --> 1。

解决过程:

给定一个单向链表1-->2-->3,通过下面的示意图,看如何一步一步的将单向列表反转。

代码实现:

1 class Node(object):

2 def __init__(self, data):

3 self.data = data

4 self.next = None

5

6 def createSingleLink():

7 head = Node(1)

8 cur = head

9 for i in range(2, 10):

10 cur.next = Node(i)

11 cur = cur.next

12 return head

13

14 def printSingleLink(head):

15 cur = head

16 while cur is not None:

17 print(cur.data, end='')

18 if cur.next is not None:

19 print("-->", end='')

20 cur = cur.next

21

22 def Reverse(head):

23 pre = None

24 cur = head

25 while cur is not None:

26 next_ = cur.next

27 cur.next = pre

28 pre = cur

29 cur = next_

30 return pre

31

32 if __name__ == '__main__':

33 singleHead = createSingleLink()

34 printSingleLink(singleHead)

35 reverSingleHead = Reverse(singleHead)

36 print()

37 printSingleLink(reverSingleHead)

View Code

2 双向链表反转

问题描述:

给定一个带头结点的双向链表,请将其逆序。即如果单链表原来为head -->1 --> 2 --> 3 --> 4 --> 5,那么逆序后变为head --> 5 --> 4 --> 3 --> 2 --> 1。

解决过程:

例如,给定一个带头结点的双向链表1-->2-->3,如下图看如何一步一步进行反转:

代码实现:

1 class Node(object):

2 def __init__(self, data):

3 self.last = None

4 self.data = data

5 self.next = None

6

7 def creatDoubleLink():

8 head = Node(1)

9 cur = head

10 for i in range(2, 10):

11 cur.next = Node(i)

12 Node(i).last = cur

13 cur = cur.next

14 return head

15

16 def printDoubleLink(head):

17 cur = head

18 while cur:

19 print(cur.data, end='')

20 if cur.next:

21 print("-->", end='')

22 cur = cur.next

23

24 def Reverse(head):

25 pre = None

26 cur = head

27 next_ = None

28 while cur:

29 next_ = cur.next

30 cur.next = pre

31 cur.last = next_

32 pre = cur

33 cur = next_

34 return pre

35

36 if __name__ == '__main__':

37 doubleHead = creatDoubleLink()

38 printDoubleLink(doubleHead)

39 reveDoubleHead = Reverse(doubleHead)

40 print()

41 printDoubleLink(reveDoubleHead)

View Code

3 总结:

单向链表和双向链表的反转比较简单,只需做到代码一次成型,运行不出错即可。上述两种代码的实现过程,都是对原有的链表进行遍历,所以如果链表长度为N,那么它们的时间复杂度和空间复杂度为O(N)和O(1)。

相关推荐

一嗨租车权益说明
体育在线365

一嗨租车权益说明

📅 01-26 👁️ 3176
如何设置省电模式:手机与电脑的节能技巧详解
det365官网登录

如何设置省电模式:手机与电脑的节能技巧详解

📅 10-07 👁️ 8540
组词大全
体育在线365

组词大全

📅 11-21 👁️ 6172
肖的多音字组词
体育在线365

肖的多音字组词

📅 09-23 👁️ 3610
被益田理财刷屏了吗?益田集团新业务强势来袭
det365官网登录

被益田理财刷屏了吗?益田集团新业务强势来袭

📅 07-03 👁️ 2099
12 房产投资:如何做出理性的买房决策?
365bet客户端下载

12 房产投资:如何做出理性的买房决策?

📅 08-26 👁️ 380