📌  相关文章
📜  交换循环链表中的第一个和最后一个节点(1)

📅  最后修改于: 2023-12-03 15:06:23.430000             🧑  作者: Mango

交换循环链表中的第一个和最后一个节点

循环链表是一种特殊的链表,其中最后一个节点指向第一个节点,形成一个环状结构。本文将介绍如何在循环链表中交换第一个和最后一个节点的位置。

算法思路

要交换循环链表中的第一个和最后一个节点,我们需要先找到链表中的最后一个节点,然后将其指向第二个节点,同时将第一个节点移到链表最后。

具体步骤如下:

  1. 如果链表为空或只有一个节点,则直接返回。
  2. 遍历链表,找到倒数第二个节点。
  3. 将最后一个节点指向第二个节点。
  4. 将第一个节点移到链表最后。
代码实现

以下是Python实现交换循环链表中第一个和最后一个节点位置的代码:

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def swap_first_last(head):
    # 处理链表为空或只有一个节点的情况
    if not head or not head.next:
        return head
    
    # 找到链表的最后一个节点和倒数第二个节点
    last_node = head
    while last_node.next.next:
        last_node = last_node.next
    second_last_node = last_node.next
    
    # 交换第一个和最后一个节点,并将链表最后节点指向第二个节点
    second_last_node.next = head.next
    last_node.next = head
    head.next = second_last_node
    
    # 返回新的头节点
    return second_last_node
测试示例

假设原始循环链表为 1 -> 2 -> 3 -> 4 -> 1,则交换后的循环链表应为 4 -> 2 -> 3 -> 1 -> 4。下面是一个完整的测试示例:

head = ListNode(1)
head.next = ListNode(2)
head.next.next = ListNode(3)
head.next.next.next = ListNode(4)
head.next.next.next.next = head

new_head = swap_first_last(head)

# 打印新的循环链表
result = []
curr = new_head
while curr:
    result.append(curr.val)
    curr = curr.next
print(result)  # 输出 [4, 2, 3, 1]