题目:
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
题目分析:
参考的别人的,感觉很醍醐奶油灌顶喔(重要的是思想嘛)
用几张图来解释应该更加清晰,假设现在有一个链表是下图这样的。
然后我们声明3个指针,一个指向当前节点, 一个指向当前节点的前一个节点,还有一个指向当前节点的后一个节点。
重点看 while
循环中的内容:第一次循环后链表变成了这样,注意节点1指向了pre(也就是NULL),此时1和2断开了。(下面都用圈表示指针,虚线处说明断链了)
没看明白?那再来一次,第二次循环过程中,current -> next = pre;
这句话让节点2指向了节点1,这时候2和3就断开了。
然后执行 pre = current;
和 current = next;
这两句话将pre指针前移到节点2,current指针前移到节点3,所以第二次循环完成后链表是这样的。
如此循环下去,将链表指针一个一个指向前一个数,从而实现了链表反转的功能。
注意:到最后一个数的时候,current和pre之间还是断开的,从上面的图也能看出来,每次循环完会有断链。所以最后用 current -> next = pre;
将链连起来。
C++代码如下:
/**
* 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) {
ListNode* current = head;
ListNode* pre = NULL;
ListNode* next = NULL;
if (head == NULL) return head;
while (current -> next) {
next = current -> next;
current -> next = pre;
pre = current;
current = next;
}
current -> next = pre;
return current;
}
};