[LeetCode] [C++] 206 Reverse Linked List 反转单项链表
题目要求
Reverse a singly linked list.
LeetCode 206在线测试
问题描述
给定一个单项链表,将其反转后返回链表头节点。
思路分析1
可以完整的遍历一遍链表,将链表的每个节点的值存在数组中,然后反向遍历数组重新生存一个新
链表。这样做需要有O(N)的空间复杂度
代码验证1
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (head == NULL || head->next == NULL) {
return head;
}
vector<int> nodeVals;
for (ListNode* p = head; p != NULL; p = p->next) {
nodeVals.push_back(p->val);
}
ListNode* pNewHead = NULL;
ListNode* pTail = NULL;
for (int i = nodeVals.size() - 1; i >= 0; --i) {
ListNode* pNew = new ListNode(nodeVals[i]);
if (pTail == NULL) {
pNewHead = pNew;
pTail = pNew;
} else {
pTail->next = pNew;
pTail = pNew;
}
}
return pNewHead;
}
};
思路分析2
遍历一次链表,每次遍历到其中一个节点时,尝试将它链表指向改变,改成指向他前一个节点,
原来链表的首节点比较特殊,需要将它的下一个指向NULL。
具体的操作流程如下图所示:
代码验证2
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (head == NULL || head->next == NULL) {
return head;
}
ListNode* pre = head;
pre->next = NULL;
ListNode* cur = head->next;
ListNode* next = NULL;
while (cur != NULL) {
next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
return pre;
};
总结注意
反转链表时,可以针对当前遍历到的节点,改变当前节点的next指针指向,实现反转当前
节点的效果。而当每个节点都执行相同的操作时,就可以实现反转整条单项链表的目的
原创声明
作者:hgli_00
链接:http://www.cnblogs.com/lihuagang/p/leetcode_206.html
来源:博客园
著作权归作者所有,转载请联系作者获得授权。