反转一个单链表
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
思路
设置一个守卫节点,首先用一个节点记录下初始链表的最后一个节点,每一次循环都把守卫后面的节点插入这个节点的后面
struct ListNode* reverseList(struct ListNode* head){
if(head==NULL||head->next==NULL) return head;//考虑空链表或只有一个节点的情况
struct ListNode* guard=(struct ListNode*)malloc(sizeof(struct ListNode));
guard->next=head;//设置守卫节点
struct ListNode* p=head;
int i=0;//记录节点总个数,待会做循环条件
struct ListNode* final;
struct ListNode* final_next;//记录final->next
while(p->next)
{
p=p->next;
i++;
}
final=p;//final指向最后一个节点
while(i!=0)
{
p=guard->next;//每一轮的开始p都指向守卫的后面一个节点
guard->next=p->next;
final_next=final->next;
final->next=p;//把守卫后面的节点插入final节点的后面
p->next=final_next;
i--;
}
return guard->next;
}
此方法笨重,但容易想到
还有一种就是节点不动,只移动指针
struct ListNode* reverseList(struct ListNode* head){
if(head==NULL||head->next==NULL) return head;
struct ListNode *pre=NULL;//pre就是反转后的链表,每次的下一个节点
while(head)
{
struct ListNode *next=head->next;
head->next=pre;//不停地把head往后移
pre=head;
head=next;
}return pre;
}