题目描述:
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
方法一:头插
创建指针cur遍历原链表,头插至rListNode处。之后先让cur移动,移动head指向的结点,再将rListNode移动到head处,head移动到cur处。直至循环到cur为null结束。
第一次:
第二次:
之后步骤类似。
代码
struct ListNode* reverseList(struct ListNode* head){
struct ListNode* rListNode = NULL, * cur;
cur = head;
while(cur)
{
cur = cur->next;
head->next = rListNode;
rListNode = head;
head = cur;
}
return rListNode;
}
方法二:三指针法
利用三个指针,在原链表上改变next的指向。
定义prev指针指向head的前一个结点,cur指向后一个结点。
将head的next指向prev。注意不能将cur的next指向head,这样就找不到下一个结点。
之后三个结点后移。
重复操作至最后
此时还需将head结点的next的指向,因此循环结束的条件为head为空,不能是cur为空。
最后cur已经为空,不能移动,所以需要增加一个条件判断。
返回prev所在结点即可
代码
struct ListNode* reverseList(struct ListNode* head){
if(head == NULL)
{
return NULL;
}
struct ListNode* prev = NULL,*cur = head->next;
while(head)
{
head->next = prev;
prev = head;
head = cur;
if(cur)
cur = cur->next;
}
head = prev;
return head;
}