我们先了解题目的原理
当链表为
5 4 3 2 1
反转后就是
1 2 3 4 5
我的思路首先是想到双指针 让指针去指向前一个节点和后一个节点
让后一个节点(n2)去指向前一个节点(n1)
但是这个节点有一个致命的错误 就是让后一个节点(n2)指向前一个节点(n1)时 后一个节点(n2)无法再找到下一个节点(因为你已经改变了n2的指向) 所以双指针的思路是不行的
那么我们要思考的点是 我们怎么样让后一个节点继续找到下一个节点呢?
我们可以再创建一个指针 指向n2的后一个节点n3
这样就成了一个思路 假设n1指向第一个节点 n2指向第二个节点 n3指向第三个节点
让n2指向n1 再让n1放在n2的位置 再把n2放到n3的位置
这里需要注意 因为是反转 那么第一个位置会变成最后一个位置 链表的最后一个位置是指向NULL的,所以n1开始需要指向NULL 让n2第一个节点指向NULL
因为是要n2指向最后一个节点 再让最后一个节点指向前一个节点 那么我们的结束条件就是n2!=NULL(可以简化为n2)
还有顺序一定不能乱 n1 n2 n3改变位置的顺序不能乱 否则会死循环 (要多画图)
最后返回的是n1 因为是反转后 n1才是指向链表的头 如果你返回的是head 返回的是链表的尾
struct ListNode* reverseList(struct ListNode* head){
struct ListNode* n1=NULL;
struct ListNode* n2=head;
while(n2)
{
struct ListNode* n3=n2->next;
n2->next=n1;
n1=n2;
n2=n3;
}
return n1;
}