剑指offer之面试题16 :反转链表

发布时间:2020-10-26 02:04:16 作者:momo462
来源:网络 阅读:852

题目:输入一个链表,反转链表后,输出链表的所有元素。

思路一:利用栈的后进先出

代码:

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) 
    {
        //利用栈的后进先出的特点,最后进的最先出
		stack<int> s1;
        ListNode *p=pHead;
        //将链表中的每个元素的值进行压栈
        while(p!=NULL)
        {
            s1.push(p->val);
            p=p->next;
        }
        //出栈,并且将栈顶元素放入链表中
        p=pHead;
        while(!s1.empty())
        {
            p->val=s1.top();
            s1.pop();
            p=p->next;
        }
        return pHead;
    }
};

思路二:进行摘结点,然后头插

代码:

class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) 
    {
        if(pHead==NULL)
        {
            return NULL;
        }
	ListNode *newHead=NULL;
        ListNode *cur=pHead;
        ListNode *tmp=NULL;
        while(cur!=NULL)
        {
            tmp=cur;
            //关键点:一定要让cur先往后走,再进行插入操作
            //不然会让原链表找不到后面的结点,结果就会变成只有一个结点
            cur=cur->next;
            tmp->next=newHead;
            newHead=tmp;
        }
        return newHead;
    }
};

思路三:利用递归,找到最后一个结点作为函数的返回值,然后在改变该链表的每一个当前pHead的位置

代码:

/*
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;
        }
        //newHead得到对应的返回值,尾节点
        ListNode *newHead=ReverseList(pHead->next);
        //然后将当先栈帧中的pHead的next进行更改
        //比如说1->2->3->4->NULL
        //newHead->4
        //pHead->3
        //4->3->null
        //此时指向3的还有1->2->3->null
		pHead->next->next=pHead;
        pHead->next=NULL;
        return newHead;
        
    }
};


推荐阅读:
  1. 面试题:从尾到头打印链表
  2. 剑指offer之面试题17 :合并两个排序的链表

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

面试题 单链表

上一篇:python实现在函数图像上添加文字和标注的方法

下一篇:C++使用JsonCpp库操作json格式数据示例

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》