LeetCode [链表] 206. Reverse Linked List (C++和Python实现)

博客围绕LeetCode 206题反转单链表展开,题目要求用迭代和递归两种方式实现。解题思路方面,迭代是在遍历链表时让结点掉头指向新结点;递归则是缩小问题规模,利用栈思想层层返回,并设置终止条件。还给出了C++和Python的解题代码。

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

206. Reverse Linked List [难度:简单]

【题目】

Reverse a singly linked list.

Example:

Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL

Follow up:

A linked list can be reversed either iteratively or recursively. Could you implement both?

【解题C++】

iteratively or recursively 来,积累英语词汇了~ 迭代和递归。话说这个居然归类为简单orz,大概是我在模拟方面比较笨蛋,我一直认为逆转链表是很难的部分了...... 

迭代有很多种实现方法,如下的就是在遍历链表的同时,让结点一个个掉头指向新结点,这个过程要更新新结点和头结点的指向,最后返回新结点就好啦。(ps:这个代码非常顶真,实在不懂也方便记忆)

/**
 * 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) 
	{
        //初始结点最后会成为尾结点,所以要置空
        ListNode *newL = NULL,*tmp = NULL;
        if(head==NULL) return head;
        //遍历链表 
        while(head)
        {
        	//记录下一个要遍历的结点 
        	tmp = head->next;
        	//当前结点指向新结点 
        	head->next = newL;
        	//更新新结点指向 
        	newL = head;
        	//更新要遍历的结点指向
        	head = tmp;
        }
        return newL;
    }
};

递归的核心是把问题的规模缩小,再调用函数一层层返回(栈的思想),最后还得加个终止条件。

/**
 * 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) 
	{
        ListNode *p1,*p2;
        //前者是空链表的判断,后者是边界条件 
        if(head==NULL||head->next==NULL)
        	return head;
       	p1 = head; //记录当前结点a0 
       	p2 = head->next; //记录下一结点a1 
       	head = reverseList(p2); //返回a1~an逆转后的头结点 
       	p2->next = p1; //用上面逆转后的尾结点指向原来的头结点 
       	p1->next = NULL; //原来的头结点逆转后作为尾结点,next域置空 
       	return head;  	
    }
};

【解题Python】 

思路同C++。

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

# 迭代版
class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        newL = tmp = None
        while head:
            tmp = head.next
            head.next = newL
            newL = head
            head = tmp
        return newL
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

# 递归版
class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        p1 = p2 = head
        if head is None or head.next is None:
            return head
        p1 = head
        p2 = head.next
        head = self.reverseList(p2)
        p2.next = p1
        p1.next = None
        return head
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值