请看题目:
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
示例1:
输入:head = [1, 2, 3, 4, 5]
输出:[5, 4, 3, 2, 1]
示例2:
输入:head = [1, 2]
输出:[2, 1]
示例3:
输入:head = [ ]
输出:[ ]
解题:
思路一:取结点头插
大体思路就是用 cur 遍历一遍链表,cur 前后各有 next 和 newhead ,通过改变 cur 的下一个结点实现链表的反转。
我是图示
代码实现:
struct ListNode* reverseList(struct ListNode* head){ struct ListNode*cur = head; struct ListNode*newhead = NULL; while(cur) { //更新头 struct ListNode*next = cur->next; cur->next = newhead; //前进 newhead = cur; cur = next; } return newhead; }
思路二:三指针反转法
与思路一类似,创建三个指针 n1, n2 ,n3 ,通过改变 n2 的下一个结点改变链表的方向。
我是图示
代码实现:
struct ListNode* reverseList(struct ListNode* head){ //排除三个结点以下的情况 if(head == NULL||head->next == NULL) { return head; } //确定位置 struct ListNode* n1,*n2,*n3; n1 = head; n2 = n1->next; n3 = n2->next; n1->next = NULL; //中间结点不为空,继续修改指向 while(n2) { n2->next = n1; n1 = n2; n2 = n3; if(n3) n3 = n3->next; } return n1; }
总结:
这篇博客为反转链表提供了两种解决方案,都属于迭代类型,你学会了吗?