📅  最后修改于: 2023-12-03 15:37:13.987000             🧑  作者: Mango
这是一道关于计算机科学的问题,考察了程序员关于链表操作的掌握程度。
题目描述:
给定一个单向链表,设计一个算法,将链表的最后一个节点移到链表的头部。
假设链表的头部为第一个节点,例如:
原始链表: 1 -> 2 -> 3 -> 4 -> 5 -> null
移动最后一个节点后的链表: 5 -> 1 -> 2 -> 3 -> 4 -> null
你需要实现一个函数,接受链表的头部节点,并返回移动后的链表的第一个节点。
函数签名如下所示:
def move_last_to_head(head: ListNode) -> ListNode:
要求将链表的最后一个节点移到头部,实现的方式可以有多种,其中最容易理解和实现的方法如下:
时间复杂度为 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 的实现描述如下:
下面给出小规模测试用例:
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
本题考察了程序员对链表操作相关知识点的理解和掌握程度,实现方式比较简单,但需要注意链表操作中的指针和引用的使用方法。通过这道题可以加深对链表的理解。
完成代码的具体实现后,还要测试函数的正确性和鲁棒性,包括处理输入边界和错误情况等。