剑指offer--反转链表

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


思路1:

1、用三个链表指针分别指向当前节点、当前节点的前一个节点,当前节点的下一个节点;

2、将节点的next指向反转,也就是让当前节点的next指向当前节点的前一个节点,最后将该链表的最后一个节点赋给一个新的节点,同时将该新节点返回;

时间复杂度:O(N)

代码实现:

#include<stack>   //链表反转
#include<vector>
struct ListNode{
	int val;
	ListNode* next;
	ListNode(int _val)
		:val(_val)
		, next(NULL)
	{}
};
ListNode* ReverseList(ListNode* pHead) {
	if (pHead == NULL)
		return NULL;

	ListNode* ptr = NULL;
	ListNode* _next = NULL;
	ListNode* node = pHead;

	ListNode* head = NULL;

	while (node != NULL)
	{
		_next = node->next;

		if (_next == NULL)
			head = node;

		node->next = ptr;
		ptr = node;
		node = _next;
	}
	return head;
	}


思路2:

1、创建一个栈;
2、将链表中节点数据遍历压入栈中,利用栈先进后出(FILO)再将栈中数据存入一个新链表中;

时间复杂度:O(N)

代码实现:

#include<stack>   //链表反转
#include<vector>
struct ListNode{
	int val;
	ListNode* next;
	ListNode(int _val)
		:val(_val)
		, next(NULL)
	{}
};
ListNode* ReverseList(ListNode* pHead) {
	if (pHead == NULL)
		return NULL;
	ListNode* head = pHead;
	stack<int> s;
	while (head != NULL)
	{
		s.push(head->val);
		head = head->next;
	}
	head = pHead;
	while (!s.empty())
	{
		head->val = s.top();
		head = head->next;
		s.pop();
	}
	return pHead;
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值