题目:
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2]
输出:[2,1]
示例 3:
输入:head = []
输出:[]
提示:
链表中节点的数目范围是 [0, 5000]
-5000 <= Node.val <= 5000
分析:
本道题,需要考虑两种情况:
**第一种:**链表为空,反转链表依然是一个空链表。
**第二种:**链表不为空,需要反转:
定义三个指针n1,n2,n3,分别指向NULL,head,head->next
通过n2来遍历链表,n3先到结尾,为空时,此时链表还没有遍历结束,还没有实现全部反转
实现反转:n2->next=n1
将n1移到n2的位置,n2移动到n3的位置,n3往后移动一个节点
n2还不为空,继续遍历,先反转:n2->next=n1
将n1移到n2的位置,n2移动到n3的位置,n3往后移动一个节点
重复此操作,直到n2为空时:
这里需要注意一下:当n2下一个为空时,此时n3已经为空,n3->next也是空,此时n3已经不需要,因此,需要判断一下n3为不为空。
遍历结束后,返回n1即可
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* reverseList(struct ListNode* head) { if(head==NULL) { return NULL; } struct ListNode*n1,*n2,*n3; n1=NULL; n2=head; n3=head->next; while(n2) { n2->next=n1; n1=n2; n2=n3; if(n3) { n3=n3->next; } } return n1; }