此题需要学过数据结构单链表的基础才能看懂大概,废话不多说上题目。
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
例1:
例如:
输入:head={1 ,2 ,3 ,4 ,5 }
输出:head={5,4,3,2,1}
如图一
如图二
如图三
上代码:(方法一)
struct ListNode* reverseList(struct ListNode* head)
{
if (!head||!head->next)//判断head或者head->next是否为空指针
return head;
struct ListNode* n1 = NULL, * n2 = head, * n3 = head->next;
//设计三个变量,n1指向head前面的空间,n2指向的是head空间,n3指向的是head->next
while(n2 != NULL)
{
//将1->NULL,将2->1,将3->2最后形成5->4->3->2->1->NULL
n2->next = n1;
//向后移位
n1 = n2;
n2 = n3;
if(n3!=NULL)
//当出现图三情况时,NULL指针不能指向下一位next
n3 = n3->next;
}
return n1;//最后n1指向最后一位(非NULL),n2=n3=NULL
}
上代码:(方法二)
struct ListNode* reverseList(struct ListNode* head)
{
if (!head|| !head->next)
return head;
struct ListNode* newHead = reverseList(head->next);
//一直递归到head->val==5才停止
//当返回递归时head->val==4,3,2,1一直递减到head(开始)
head->next->next = head;
//相当于把1->2->3->4<->5->NULL
//后面也就回形成
// 1->2->3<->4<-5
//1->2<->3<-4<-5
//1<->2<-3<-4<-5
head->next = NULL;
//把4<->5变成4<-5
//将一方的转向变为NULL,也就不会出现双方指向双方的情况
return newHead;
//当递归返回到最后时newHead->val==1的位置
}
无论方法一还是二,都是让指针的next指向反方向,方法一为防止n2指向n1后丢失n2后面的地址,使用设计出n3来记录n2->next,防止找不回导致下一步无法实施