https://leetcode.cn/problems/reverse-linked-list/
特解思路:
定义三个结构体指针,分别指向前结点,目前所在结点(后面以“此”来代替)和后结点。
通过此点指向前结点,迭代更新前,此,后结点,直到此结点为空。
特殊情况:处理head可能为空的情况,如果为空,直接返回head
而此结点后面可能也为空,所以也针对此情况做处理,如果此结点后为空,则不再更新指向后结点的指针
//接口实现
struct ListNode* reverseList(struct ListNode* head)
{
if(head == NULL)
return head;
struct ListNode* n1 = NULL;
struct ListNode* n2 = head;
struct ListNode* n3 = n2->next;
while(n2)
{
// 倒指向
n2->next = n1;
// 迭代更新指针
n1 = n2;
n2 = n3;
if(n3)
n3 = n3->next;
}
return n1;
}
通解思路:
定义两个指针,分别指向当前结点和前一个结点。
因为这里是接口实现,返回的是结点地址,所以可以直接用 head 指针来保存下一个结点的地址,也可以另外定义一个 next 指针来保持
先用 head 保持下一个结点地址,然后让当前结点与前一个结点链接,然后更新newhead与cur,直到 cur 为空。此时newhead指向最后一个结点,也就是反转后的头结点。
//接口实现
struct ListNode* reverseList(struct ListNode* head){
struct ListNode* cur =head;
struct ListNode* newhead = NULL;
while(cur)
{
//头插
head = cur->next;
cur->next = newhead;
newhead = cur;
cur = head;
}
return newhead;
}