题目要求
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
来源:博客园
著作权归作者所有,转载请联系作者获得授权。