单链表原地翻转的问题,很经典的题目,之前一直记不住,还是理解的不够透彻。
思路:首先定义一个dummy节点放在链表的最前面,(作为链表头,因为真正的头是变化的,最后返回dummy->next)。令指针cur指向head,然后取cur后面的一个,把它插入dummy后面,也就是把cur后面的一个一个放到dummy后,迭代结束的条件就是cur成为最后一个节点,即它后面的节点都已经放到前面去了。
代码:
/**
* Definition of ListNode
*
* class ListNode {
* public:
* int val;
* ListNode *next;
*
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param head: The first node of linked list.
* @return: The new head of reversed linked list.
*/
ListNode *reverse(ListNode *head) {
if(head==NULL || head->next==NULL){
return head;
}
ListNode *dummy = new ListNode(0);
dummy->next = head;
ListNode *cur = head;
while(cur->next!=NULL){//结束条件:cur为最后一个节点
ListNode *temp = cur->next;//保存cur的下一个
cur->next = temp->next;//把cur和它的下下个接起来(跳过下一个)
temp->next = dummy->next;//把temp放在dummy后,即链表最前面
dummy->next = temp;//dummy的下一个赋成temp
}
return dummy->next;
}
};