# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
#迭代法
if not head:
return None
pre,cur = None,head
while cur:
tmp = cur.next
cur.next = pre
pre = cur
#移动cur的位置
cur = tmp
return pre
#递归法
if not head or not head.next:
return head
cur = self.reverseList(head.next)
head.next.next = head
head.next = None
return cur
递归法虽然效率不是很高,但是也是一个非常有意思的方法,leetcode题解这个动图做的非常不错,深入的理解了如何去做递归,但凡是可以吧一个大问题拆解成无数的小问题,就可以利用递归的方法去做。
分析
- 设置一个空节点
- 保存当先节点的下个节点
- 让当前节点的下个节点指向空间点
- 然后移动改变pre的值,在移动当前节点到下个节点
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def reverseBetween(self, head: ListNode, m: int, n: int) -> ListNode:
dummpy = ListNode(0)
dummpy.next = head
pre = dummpy
cur = head
i = 1
while i<m:
pre = pre.next
i+=1
head = pre.next
new = None
#先把m~n之间的链表反转了
while m<=n:
tmp = head.next
head.next = new
new = head
head = tmp
m+=1
#将反转后的链表的m后面的链表连上
flag = new
while flag and flag.next:
flag = flag.next
flag.next = head
#然后讲pre的下个指针指向new即可
pre.next = new
#完成链表的反转
return dummpy.next
分析
- 和刚才的题目基本一模一样,只不过需要先找出反转的链表范围,然后执行反转的操作即可
- 先找到反转的第一个节点head
- 然后对m-n之间的链表进行反转
- 反转之后,将反转的链表的最后一个节点指向剩余的链表
- 然后再将m之前的节点的指针指向后面已经反转拼接好的链表
- 最后返回反转后的链表
总结:链表的反转不管是从中间或者结尾来说都是一样的,反转中间就找到中间的范围反转即可。