方法一代码
struct ListNode\* cur=head;
struct ListNode\* newhead=NULL;
while(cur)
{
struct ListNode\* next=cur->next;
cur->next=newhead;
newhead=cur;
cur=next;
}
return newhead;
题解(方法二)
(1)翻转方向
(2)代码实现细节图解
方法二代码
struct ListNode\* reverseList(struct ListNode\* head){
struct ListNode\* n1,\*n2,\*n3;
//防止链表为空n3赋值放在循环里面
n1=NULL,n2=head,n3=NULL;
while(n2)
{
n3=n2->next;
n2->next=n1;
//迭代
n1=n2;
n2=n3;
}
return n1;
}
3.链表的中间结点
题目
题解
(1)通过快慢指针,可以只遍历一遍链表就能得出正确答案
(2)快指针一次走两步,慢指针一次走一步,快指针走完链表,慢指针刚好在一半处。
(3)图解
代码
struct ListNode\* middleNode(struct ListNode\* head){
//快慢指针
struct ListNode\* f=head,\*s=head;
//注意两个判断条件
while(f&&f->next)
{
s=s->next;
f=f->next->next;
}
return s;
}
4. 链表中倒数第k个结点
题目
[链表中倒数第k个结点_牛客题霸_牛客网 ](链表中倒数第k个结点_牛客题霸_牛客网 (nowcoder.com))
题解
(1)方法还是快慢指针
(2)fast先走一步,fast跟slow再同时走,最后slow停在的地方就是倒数第一个。
类推,fast先走k步,fast跟slow再同时走,最后slow停在的地方就是倒数第几个。
(3)图解:
注意
(1)为什么fast先走的循环中使用k–,使用–k可以吗?
代码while(k–),k–的含义:每次先用k,然后再自减。