📜  资质| GATE IT 2006 |问题5(1)

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

资质考试 | GATE IT 2006 | 问题5

简介

GATE(Graduate Aptitude Test in Engineering,工程硕士研究生能力入学考试)是印度国家技术学院联合会(Indian Institute of Science and seven Indian Institutes of Technology)主持的全印度性的研究生资格考试。GATE IT 2006 是 GATE 的一部分,专门测试计算机科学与信息技术方面的能力。问题5 主要测试程序员在数据结构和算法方面的掌握程度。

问题描述

给定一个单链表,每个节点包含一个整数值和一个指向下一个节点的指针。请编写一个函数 reverse(),将链表中的节点顺序反转。

例如,给定链表1- > 2- > 3- > 4- > 5,反转后变为5- > 4- > 3- > 2- > 1。

解决方案
算法

反转链表可以通过迭代或递归实现。

迭代法

迭代法是通过从头到尾遍历链表,同时反转每个节点的指针,直到遍历到链表末尾,即可完成链表的反转。

以下是迭代法反转链表的代码实现:

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        prev = None
        cur = head
        while cur:
            next_node = cur.next
            cur.next = prev
            prev = cur
            cur = next_node
        return prev

递归法

递归法则是先递归调用反转函数,将当前节点的下一个节点反转,然后再将自己作为下一个节点的 next 指针返回。需要注意的是最后一个节点的 next 指针需要设为空。

以下是递归法反转链表的代码实现:

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        if not head or not head.next:
            return head
        new_head = self.reverseList(head.next)
        head.next.next = head
        head.next = None
        return new_head
复杂度分析
  • 时间复杂度:$O(n)$,n 表示链表的长度,需要遍历每个节点并反转其指针。
  • 空间复杂度:$O(1)$,只需要常数个变量来保存当前节点和其它指针。
总结

本文介绍了如何通过迭代和递归两种方法实现反转链表。程序员在解决这个问题时,需要对链表数据结构进行基本的操作,例如节点的新增、删除、移动和指向等,同时要考虑到时间和空间复杂度的问题。