
法一:


原地逆置法:不创建新的空间,只是修改指针域,让每个后继节点指向它的前驱结点

不要忘记把head指针也移过去
对于没有头结点的链表,head指针一开始指向1,而且也要用尾插法
假设1的前驱节点是NULL
循环结束条件:pre==temp==NULL
初始化:

temp,current都赋值为NULL,当pre!=NULL时,先让temp=pre→next,然后1指向NULL
current再指向pre,pre再指向temp
法三:试试递归,把原地逆置法用递归的思想写出来
cpp
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* pre=head;
ListNode* temp=head;
if(pre!=NULL)
{
pre=pre->next;
head->next=NULL;
}
while(pre!=NULL)
{
head=pre;
pre=pre->next;
head->next=temp;
temp=head;
}
return head;
}
};
例2. LCR 140. 训练计划 II - 力扣(LeetCode)

在未知head链表长度的情况下,有两个思路
1.原地转置后找 2.先遍历一遍找到结点个数,再遍历找
3.快慢指针,遍历一次找到,快指针指向NULL,慢指针刚好指向答案

cpp
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : aval(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* trainingPlan(ListNode* head, int cnt) {
//未知长度
//双指针:l指针 r指针先走k个单位
ListNode* l=head;
ListNode* r=head;
int i=0;
while(r!=NULL&&i<cnt)
{
r=r->next;
i++;
}
while(r!=NULL)
{
l=l->next;
r=r->next;
}
return l;
}
};
链表: 原地逆置 快慢指针(一前一后,按题意来)
静态链表:用数组模拟链表


