描述:翻转一个链表
样例
给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->null
思路:刚开始不是很懂,后面参考网上,也不是很理解。后来在论坛求助,感谢论坛里面大神@qq_36782456@ccssddnn218的帮助!
class Solution {
public:
/**
* @param head: The first node of linked list.
* @return: The new head of reversed linked list.
*/
ListNode *reverse(ListNode *head) {
ListNode *prev = NULL;
while (head != NULL) {
ListNode *temp = head->next;
head->next = prev;
prev = head;
head = temp;
}
return prev;
}
};
[quote=引用 2 楼 qq_36782456 的回复:]
这个应该很好理解吧 就是链表的回指
假如 1—>2—>3—>4—>null
首先让null<—1
再次循环 null<—1<—2
接着循环 null<—1<—2<—3
null<—1<—2<—3<—4
返回 4的节点,就是prev。[/quote]
[quote=引用 1 楼 ccssddnn218 的回复:]
[code=c]//交换前
+------------+ +-------------+ +-------------+
|node1 | | node2 | | node3 |
|data | | data | | data |
|next(node2) | | next(node3) | | next(NULL) |
+------------+ +-------------+ +-------------+
node1 -> node2 -> node3
//交换后
+------------+ +-------------+ +-------------+
|node1 | | node2 | | node3 |
|data | | data | | data |
|next(NULL) | | next(node1) | | next(node2)|
+------------+ +-------------+ +-------------+
node1 <- node2 <- node3
[/code]
就把这些节点的next值修改一下就完了。[/quote]
这是结合他们的回答,自己做的一个分析草图。
temp用来存放以前的链表,使之可以遍历原来的链表。pre用来使每个head都指向他的上一个数,然后将新的head赋给pre。以此循环,最后就pre存放的就是原来链表的最后一个数,并且每个数都指向原来链表中的上一个数。最后返回pre,也就实现了链表的反转。