题目链接:
力扣https://leetcode.cn/problems/reverse-linked-list/description/
解题思路:
在原有的内存结构基础上(即不开辟新的内存空间),通过遍历整个单链表进而逐步实现“ 头插 ”
参考代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head)
{
struct ListNode *cur = head;
struct ListNode *newhead = NULL;
while (cur)
{
struct ListNode *Next = cur->next;
cur->next = newhead;
//cur = newhead;易错点,顺序不能颠倒
newhead = cur;
cur = Next;
}
return newhead;
}
代码解读:
1. 首先需要俩个结构体指针 cur 与 newhead
其中 cur 的作用是遍历整个单链表,所以它的初始化值为头结点的地址
newhead 的作用是在最后返回新的头结点,所以它的初始值为 NULL
2. 在 cur 进行遍历时,从第一个结点开始,因为是逐步地进行 “ 头插 ” ,所以先要保存当前结点的下一个结点的地址,然后 newhead 的值要被赋给每一个进行头插操作结点中的指针域,
因为随着多次头插的操作,newhead 的值也需要改变,而它的改变就需要每一次 cur 的加1得到的新值被赋给 newhead
而 cur 之所以能够向后逐渐遍历,则是因为前面保存了当前结点的下一个结点 的地址,所以将这个值赋给 cur
解题方法二:
改变俩俩结点的指针,使其指向相反的方向