206. 反转链表及扩展
206. 反转链表
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
递归
# 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 or not head.next:return head ans=self.reverseList(head.next) head.next.next=head head.next=None return ans
92. 反转链表 II
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list-ii
简单来说就是取出m~n的这一小段链表,反转后再插回去
图片来自网络
class Solution: def reverseBetween(self, head: ListNode, m: int, n: int) -> ListNode: if not head.next or n == 1: return head dummy = ListNode() dummy.next = head pre = None cur = head i = 0 p1 = p2 = p3 = p4 = None while cur: i += 1 next = cur.next if m < i <= n: cur.next = pre if i == m - 1: p1 = cur if i == m: p2 = cur if i == n: p3 = cur if i == n + 1: p4 = cur pre = cur cur = next if not p1: dummy.next = p3 else: p1.next = p3 p2.next = p4 return dummy.next
25. K 个一组翻转链表
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例:
给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
说明:
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group
同理
class Solution: def reverseKGroup(self, head: ListNode, k: int) -> ListNode: if head is None or k < 2: return head dummy = ListNode(0) dummy.next = head pre = dummy cur = head count = 0 while cur: count += 1 if count % k == 0: pre = self.reverse(pre, cur.next) cur = pre.next else: cur = cur.next return dummy.next def reverse(self, p1, p4): prev, curr = p1, p1.next p2 = curr while curr != p4: next = curr.next curr.next = prev prev = curr curr = next # 将反转后的链表添加到原链表中 # prev 相当于 p3 p1.next = prev p2.next = p4 # 返回反转前的头, 也就是反转后的尾 return p2