206.反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
思路:
涂鸦中序号表示思考的顺序,实际执行还是126345
1. 创建一个节点pre指向Null
2. 创建节点cur指向head
3. 反转指向,将pre作为cur的下一节点,cur.next = pre
4. pre节点后移,pre = cur
5. cur节点后移(cur = cur.next)由于步骤3已经令cur.next=pre,所以需要提前缓存cur的下一节点,cur = temp
6. 提前缓存cur的下一节点,temp = cur.next
代码:
def reverseList(head:ListNode):
pre = None
cur = head
while cur:
temp = cur.next
cur.next = pre
pre = cur
cur = temp
return pre
打怪升级难度
92.反转链表 II
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
思考:
刚才完全反转链表,将(pre)指向了(null),现在可以把(pre)指向(m-1)节点,那(n)怎么处理呢?
恩~,如果遍历到(n)就停止,把剩下的接到新链表应该就可以了
创建pre,cur指针 分别指向None和head,后移直到cur指向m位置
反转子链表,直到pre走到n位置,拼起来
1. 创建pre,cur指针 分别指向None和head
2. pre和cur一起后移,直到cur到m位置。可以看到在子链表反转后,cur会接到未反转部分,pre接到反转后子链表的头部。保存下cur和pre记录为tail和con
3. 反转子链表,直到pre走到n位置
4. 拼起来
coding
def reverseList2(head:ListNode,m,n):
pre, cur = None,head
index = 1
while index < m:
pre = cur
cur = cur.next
index += 1
con,tail = pre,cur
while index <= n:
temp = cur.next
cur.next = pre
pre = cur
cur = temp
index += 1
if con:
con.next = pre
else:
head = pre
tail.next = cur
return head