算法 反转链表

前言

题目链接

在这里插入图片描述


一、迭代法1

1.1

链表的原始状态如下所示:

在这里插入图片描述

1.2

首先,定义三个指针变量 prev,curr 和 next。
刚开始,prev 指向 NULL; curr 指向第一个节点,next 指向第二个节点。

第一阶段迭代,让 curr 节点的 next指向 prev 节点。
此时,节点1的 next 指向 NULL。
在这里插入图片描述

第二阶段迭代, prev,curr 和 next 向后迭代。
此时 prev 指向节点1,curr 指向节点2,next 指向节点3。
接着,继续让 curr 节点的 next 指向 prev 节点。
此时,节点2的 next 指向 节点1。
在这里插入图片描述

最终代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* reverseList(struct ListNode* head){
    struct ListNode *prev = NULL, *curr = NULL, *next = NULL;

    if (head == NULL) return NULL;

    curr = head;

    while(curr)
    {
        next = curr->next;

        curr->next = prev;

        prev = curr;
        curr = next;
    }

    return prev;
}

二、迭代法2

该方法使用“串葫芦”的方法。图解如下

2.1

初始状态如下:
在这里插入图片描述


2.2

首先,定义三个指针变量 list1_curr,list1_next和 list2_head。
刚开始,list1_curr 和 list1_next 属于原始的链表,list2_head 属于新串的链表。

第一阶段迭代,让 list1_curr 节点的 next指向 list2_head 节点。
此时,list1_curr 节点成为了新串链表的头节点。

之后,进行状态更替:
list1_curr 赋值给 list2_head ;
list1_next 赋值给 list1_curr ;
list1_curr 的 nexti 节点成为新的 list1_next 。

在这里插入图片描述


2.3

第二阶段迭代,重复第一阶段的操作。
此时,新串又得到了最新的链表头,而且新串链表与原有链表是翻转的。

在这里插入图片描述


最终代码如下:

struct ListNode* reverseList(struct ListNode* head){
    struct ListNode *list1_curr = NULL, *list1_next = NULL, *list2_head = NULL;

    if (head == NULL) return NULL;

    list1_curr = head;

    while(list1_curr)
    {
        list1_next = list1_curr->next;

        list1_curr->next = list2_head;

        list2_head = list1_curr;
        list1_curr = list1_next;
    }

    return list2_head;
}


三、递归法

图解如下,不再赘述。

3.1

第一阶段
在这里插入图片描述


3.2

第二阶段

在这里插入图片描述


3.3

最终代码如下:

struct ListNode* reverseList(struct ListNode* head){
    struct ListNode *curr = NULL, *next = NULL, *ret = NULL;

    if ( !head || !head->next) return head;

    curr = head;
    next = curr->next;

    ret = reverseList(next);

    next->next = curr;
    curr->next = NULL;
    
    return ret;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值