反转链表 (反转整个链表+反转部分链表)
发布人:shili8
发布时间:2024-11-15 17:16
阅读次数:0
**反转链表**
================在数据结构中,链表是一种常见的线性数据结构。链表中的每个元素称为结点(Node),它包含一个值和一个指向下一个结点的引用。在某些情况下,我们需要反转链表,这意味着将原来的最后一个结点变成新的第一个结点,依此类推。
**反转整个链表**
----------------首先,让我们来看一下如何反转整个链表。假设我们有一个单向链表的头指针为 `head`,我们需要反转整个链表。
###代码示例
class Node: def __init__(self, value): self.value = value self.next = Nonedef reverse_linked_list(head): """ 反转整个链表。 :param head: 链表的头指针 :return: 反转后的链表的头指针 """ prev = None current = head while current: #保存下一个结点 next_node = current.next # 将当前结点反转 current.next = prev # 移动指针 prev = current current = next_node return prev# 测试代码head = Node(1) head.next = Node(2) head.next.next = Node(3) print("原链表:") while head: print(head.value, end=" ") head = head.nextnew_head = reverse_linked_list(head) print(" 反转后的链表:") while new_head: print(new_head.value, end=" ") new_head = new_head.next
###代码注释* 我们使用一个 `prev` 变量来保存当前结点的前驱结点。
* 我们使用一个 `current` 变量来遍历链表。
* 在每个循环中,我们将当前结点的 `next` 指针设置为 `prev`,这相当于反转了当前结点。
* 然后我们移动指针,更新 `prev` 和 `current` 的值。
**反转部分链表**
----------------现在,让我们来看一下如何反转链表的一部分。假设我们有一个单向链表的头指针为 `head`,我们需要反转从第 `m` 个结点到第 `n` 个结点之间的链表。
###代码示例
def reverse_part_linked_list(head, m, n): """ 反转链表的一部分。 :param head: 链表的头指针 :param m: 开始反转的结点位置(从1 开始) :param n: 结束反转的结点位置(从1 开始) :return: 反转后的链表的头指针 """ # 将链表分成三部分:前 m-1 个结点、反转的 m-n+1 个结点和后 n+1 个结点 dummy = Node(0) dummy.next = head pre = dummy for i in range(m -1): pre = pre.next cur = pre.next # 反转链表的一部分 for _ in range(n - m): next_node = cur.next cur.next = next_node.next next_node.next = pre.next pre.next = next_node return dummy.next# 测试代码head = Node(1) head.next = Node(2) head.next.next = Node(3) head.next.next.next = Node(4) head.next.next.next.next = Node(5) print("原链表:") while head: print(head.value, end=" ") head = head.nextnew_head = reverse_part_linked_list(head,2,4) print(" 反转后的链表:") while new_head: print(new_head.value, end=" ") new_head = new_head.next
###代码注释* 我们使用一个 `dummy` 结点来简化边界处理。
* 我们将链表分成三部分:前 m-1 个结点、反转的 m-n+1 个结点和后 n+1 个结点。
* 然后我们反转链表的一部分。
以上就是如何反转整个链表和反转链表的一部分的代码示例和注释。