反转链表的题目,比较基础,但是很容易蒙
我的这种方法是建立一个头,然后一个一个反转
每次都将原第一个结点之后的那个结点放在list后面,下图是原始的单链表。
为了反转这个单链表,我们先让头结点的next域指向结点2,再让结点1的next域指向结点3,最后将结点2的next域指向结点1,就完成了第一次交换,顺序就变成了Header-结点2-结点1-结点3-结点4-NULL,然后进行相同的交换将结点3移动到结点2的前面,然后再将结点4移动到结点3的前面就完成了反转
原文地址:http://www.cnblogs.com/pianoid/archive/2011/05/03/reverse-a-singly-linked-list.html
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* curr= head;
ListNode* tmp;
ListNode* first = new ListNode(2);
if(head==NULL) return NULL;
first->next = curr;
while(curr->next!=NULL){
tmp=curr->next;
curr->next=tmp->next;
tmp->next=first->next;
first->next=tmp;
}
return first->next;
}
};
最后注意的是,返回的时候要返回first->next而不是head,因为head变了···
ListNode* reverseList(ListNode* head)
{
ListNode* prev = NULL;
while (head != NULL)
{
ListNode* next = head->next;
head->next = prev;
prev = head;
head = next;
}
return prev;
}