LeetCode算法题206:反转链表解析

本文详细解析LeetCode第206题——反转链表,提供递归和迭代两种解题思路,并附带C++和Python3的源代码实现。通过递归法,需要注意返回头节点并保存中间节点;迭代法则利用空节点逐步插入,完成链表反转。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

反转一个单链表。
示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

这个题看起来简单,但是想起来还是得一些小技巧,可能最近脑子不太灵光,这个题竟然想了很久。。。。首先肯定是要用两种方法的,递归法要注意的就是一方面最后返回的节点是头节点,所以不能变,只能有一个变量表示头节点,然后中间的话由于要从最后来往回执行,所以一定是要保存一下当前节点的,而且链表可以改变指向,因此从最后往回推那就应该是返回了头节点,而倒数第二个节点在倒数第二次递归中保存了下来,所以改变其指向就可以。
C++源代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if (head==NULL || head->next==NULL)
            return head;
        ListNode *p = head;
        head = reverseList(p->next);
        p->next->next = p;
        p->next=NULL;
        return head;
    }
};

注意这个递归程序返回了head,这个head是头节点,所以返回之后就不可以再动了,其余操作都是由于后面的节点指向发生了变化所以可以直接进行操作。
迭代法就是在前面设置一个空节点,然后不断循环往中间插就可以。
python3源程序:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def reverseList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        if head==None:
            return head
        preHead = ListNode(0)
        preHead.next = head
        p = preHead
        while head.next:
            tmp = head.next
            head.next = tmp.next
            tmp.next = preHead.next
            preHead.next = tmp
        return preHead.next
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值