反转链表
1°题目链接
链接
2°思路
思路1(暴力):
定义两个指针或者三个指针
这里选择三个指针 清晰一点
头部 头部的下一个 头部的下一个的下一个
n1 n2 n3
做好n2和n1的连接:
n2->next=n1
然后:
n2=n1 n3=n2 n3=n3->next
相当于三个指针都往下走一步
如果不先定义 直接连接的话 找不到下一个地址了
这样到最后n1为原来尾部的指针 也就是新头部的指针
循环结束条件是n2==NULL
循环结束之前的最后一次:
n2为尾部 n3这时是NULL 不要解引用 加一个判断条件
思路2(头插):
3°实现
暴力:
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;
}
头插:
struct ListNode* reverseList(struct ListNode* head)
{
if (head == NULL)
return NULL;
struct ListNode* newhead = NULL;
struct ListNode* cur = head;
struct ListNode* next = head->next;
while (cur)
{
//头插
cur->next = newhead;
//迭代
newhead = cur;
cur = next;
if(next)
next = cur->next;
}
return newhead;
}
4°运行结果
#7反转链表#完