题目描述:输入一个链表,反转链表后,输出链表的所有元素。
思路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;
}
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;
}