📌  相关文章
📜  数据结构示例-交换单向链表第一个和最后一个节点(1)

📅  最后修改于: 2023-12-03 14:54:57.217000             🧑  作者: Mango

数据结构示例-交换单向链表第一个和最后一个节点

在单向链表中,每个节点只有指向下一个节点的引用,从而形成一个链式结构。交换单向链表的第一个和最后一个节点需要遍历整个链表,找到链表的头节点和尾节点,然后交换它们。

实现思路

交换单向链表的第一个和最后一个节点需要遍历整个链表,找到链表的头节点和尾节点,然后交换它们。具体实现思路如下:

  1. 判断链表是否为空,如果为空则不进行任何操作
  2. 对链表进行遍历,找到链表的最后一个节点,同时记录下链表的长度
  3. 如果链表的长度小于等于1,则直接返回原链表,不进行任何操作
  4. 找到链表的第一个节点,记录下它的值和指针
  5. 遍历链表,找到倒数第二个节点,并记录下它和最后一个节点的指针及值
  6. 将最后一个节点的指针指向第一个节点,倒数第二个节点的指针指向空节点
  7. 将新的头节点指针返回
实现代码
def swap_first_and_last(head):
    if not head or not head.next:
        return head

    cur = head
    length = 1
    while cur.next:
        cur = cur.next
        length += 1

    last = cur
    cur = head
    for _ in range(length-2):
        cur = cur.next

    first = cur.next
    cur.next = None
    last.next = head
    first.next = None
    return last
测试代码
class Node:
    def __init__(self, val=None, next=None):
        self.val = val
        self.next = next

def print_list(head):
    cur = head
    while cur is not None:
        print(cur.val, end=' ')
        cur = cur.next
    print()

def main():
    head = Node(1, Node(2, Node(3, Node(4, Node(5)))))
    print_list(head)
    head = swap_first_and_last(head)
    print_list(head)

if __name__ == '__main__':
    main()
测试结果

输入:

1 -> 2 -> 3 -> 4 -> 5

输出:

5 -> 2 -> 3 -> 4 -> 1