【剑指offer】链表——015 反转链表


在这里插入图片描述


题目内容

输入一个链表,反转链表后,输出新链表的表头。

题目分析

还是老样子,单向链表,但是需要把链表原来的尾结点作为头结点,且原来的next指针需要指向自己的上一个结点,原来头结点的next指针指向NULL。
常规且比较暴力的思路是,借助数组,先从头到尾遍历找到尾结点,然后从尾到头依次修改next指针。而稍微具有技巧性的则是从网上学习到的三指针法

解题

暴力解法

主要思路如下:

  1. 从头到尾遍历链表将结点依次赋值给数组并记录链表长度;
  2. 从尾到头倒序修改结点的next指针;
  3. 单独修改原头结点的next指针,指向NULL。

代码

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        if(pHead == NULL)
            return NULL;
        ListNode* node[10010];
        int length = 0;
        while(pHead != NULL){
            node[length++] = pHead;
            pHead = pHead->next;
        }
        for(int i = length-1; i > 0; i--){
            node[i]->next = node[i-1];
        }
        node[0]->next = NULL;
        return node[length-1];
    }
};

三指针法

主要步骤不方便用语言描述,改为图片叙述,以三个结点的链表为例,定义三个指针,分别为preNode、nowNode、nextNode;

ListNode* preNode = NULL;
ListNode* nowNode = pHead;
ListNode* nextNode = nowNode->next;

过程如图
在这里插入图片描述
代码

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        if(pHead == NULL)
            return NULL;
        ListNode* preNode = NULL;
        ListNode* nowNode = pHead;
        ListNode* nextNode = nowNode->next;
        while(nowNode!=NULL){
            nowNode->next = preNode;
            preNode = nowNode;
            nowNode = nextNode;
            nextNode = nextNode->next;
        }
        return preNode;
    }
};

递归解法

主要步骤不方便用语言描述,改为图片叙述,以三个结点的链表为例,过程如图
在这里插入图片描述
代码

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        // 处理链表为空或仅有一个结点时的情况,同时为了找到尾结点时终止递归
        if(pHead == NULL || pHead->next == NULL)
            return pHead;
        ListNode* EndNode = ReverseList(pHead->next);
        pHead->next->next = pHead;
        pHead->next = NULL;
        return EndNode;
    }
};

以上思路为个人想法和网络各位大佬的题解的结合,欢迎讨论与指正。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值