📌  相关文章
📜  国际空间研究组织 | ISRO CS 2008 |问题 42(1)

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

国际空间研究组织 | ISRO CS 2008 |问题 42

这是一道关于计算机科学的问题,考察了程序员关于链表操作的掌握程度。

题目描述:

给定一个单向链表,设计一个算法,将链表的最后一个节点移到链表的头部。

假设链表的头部为第一个节点,例如:

原始链表: 1 -> 2 -> 3 -> 4 -> 5 -> null

移动最后一个节点后的链表: 5 -> 1 -> 2 -> 3 -> 4 -> null

你需要实现一个函数,接受链表的头部节点,并返回移动后的链表的第一个节点。

函数签名如下所示:

def move_last_to_head(head: ListNode) -> ListNode:
思路

要求将链表的最后一个节点移到头部,实现的方式可以有多种,其中最容易理解和实现的方法如下:

  • 遍历整个链表,找到最后一个节点和倒数第二个节点。将最后一个节点的 next 指针指向链表的头部,同时将倒数第二个节点的 next 指针指向 null。

时间复杂度为 O(n),空间复杂度为 O(1)。

代码实现
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def move_last_to_head(head: ListNode) -> ListNode:
    if not head or not head.next:
        return head

    curr = head
    while curr.next:
        prev = curr
        curr = curr.next

    prev.next = None
    curr.next = head
    return curr

在以上代码中,我们定义了一个 ListNode 类来表示链表中的节点。函数 move_last_to_head 的实现描述如下:

  • 如果链表为空或者只有一个节点,则直接返回。
  • 通过遍历整个链表,找到最后一个节点和倒数第二个节点。
  • 将最后一个节点的 next 指针指向链表的头部,同时将倒数第二个节点的 next 指针指向 null。
  • 返回移动后的链表的第一个节点。
测试

下面给出小规模测试用例:

l1 = ListNode(1)
l1.next = ListNode(2)
l1.next.next = ListNode(3)
l1.next.next.next = ListNode(4)
l1.next.next.next.next = ListNode(5)

res = move_last_to_head(l1)

while res:
    print(res.val, end=' ')
    res = res.next

输出结果为:

5 1 2 3 4
总结

本题考察了程序员对链表操作相关知识点的理解和掌握程度,实现方式比较简单,但需要注意链表操作中的指针和引用的使用方法。通过这道题可以加深对链表的理解。

完成代码的具体实现后,还要测试函数的正确性和鲁棒性,包括处理输入边界和错误情况等。