一、题目简述
给定链表头节点head,反转这个链表,并返回反转后的链表。
例如:
二、题目分析
将链表进行反转,只需要将原链表的节点依次取下,进行头插即可。但在取下原链表节点时要注意保存head->next节点,以便找到下一个节点,直到遍历完链表为止。
每头插一个节点,反转后的链表的头节点都会改变,所以每次插入都需要更新头节点。
三、代码分析
1、定义变量
struct ListNode* newHead=NULL;//新头节点
struct ListNode* nextNode=NULL;//保存下一个节点
定义一个为空的头节点,反转结束后返回newhead。将newhead置为NULL,如果head为NULL,那么将直接返回newhead即可。
定义nextnode,在取出原链表的头节点之前保存下一个节点,以便能够找到下一个节点位置。
2、取出节点并头插
while(head)
{
nextNode=head->next;//先保存下一个节点
head->next=newHead;//进行头插
newHead=head;
head=nextNode;//更新原链表与新链表的头节点
}
nextnode先保存head的下一个节点,并将原链表的头节点head头插到新链表的头上,head->next=newhead,此时newhead并不是头节点,需要更新newhead,newhead=head。
重复上上述步骤,直到head为NULL,也就是将原链表所有头节点取下,循环结束。
如果head一开始就为NULL节点,那么将不进入循环,直接返回newhead即可,因为newhead一开始就为NULL节点。
四、完整代码
struct ListNode* reverseList(struct ListNode* head) {
struct ListNode* newHead=NULL;//新头节点
struct ListNode* nextNode=NULL;//保存下一个节点
while(head)
{
nextNode=head->next;//先保存下一个节点
head->next=newHead;//进行头插
newHead=head;
head=nextNode;//更新原链表与新链表的头节点
}
return newHead;//返回反转后的链表
}