给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
链表的本质就是改变每一个结点的next域。
我们从第一个结点开始遍历,改变它的next域。
当我们要注意在改变当前结点的next域之前,我们需要靠next值找到其后的一个结点
,并保存起来。
然后我们进行更新指针。
(我们更新指针只是更新cur和pre,而不专门对tmp进行更新,原因是循环遍历时我们让cur指针进行遍历的,即cur作为循环条件,而tmp作为cur的后驱结点,值会更先为NULL,当cur指向NULL时,再以tmp=cur->next
更新tmp,这时候就是对空指针的非法访问
了。所以我们更新的话只是对cur和pre。)
循环的条件为cur不为空指针。这是执行循环体的最后一次。更新cur和pre,然后cur指向空指针,pre为当前cur的值。
再次进入循环体,cur为NULL,不满足循环条件而退出循环。
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode* reverseList(struct ListNode* head){
struct ListNode* cur=head;
struct ListNode* pre=NULL;
struct ListNode* tmp;
while(cur)
{
tmp=cur->next;//记录后一个结点
cur->next=pre;//改变next域
//更新
pre=cur;
cur=tmp;
}
return pre;
}