法1 双指针定位
定义:
1.指针的运行速度;
2.指针的距离。
例:
1.找中间节点
定义i,j两个指针,j的运行速度时i的两倍,当j走到最后的时候,i所指为中间节点。
ListNode * middleNode(ListNode* head) {
ListNode* i = head;
ListNode* j = head;
while (j != nullptr && j->next != nullptr)
{
i = i->next;
j = j->next->next;
}
return i;
}
2.返回倒数第k个节点的值
int kthToLast(ListNode* head, int k) {
ListNode* i = head;
ListNode* j = head;
for (int i = 0; i < k; i++)
{
j = j->next;
}
while (j != nullptr)
{
i = i->next;
j = j->next;
}
return i->val;
}
法2.递归反转链表
秘诀:一定要相信自己的递归是对的
1)向下一层要结果;
2)在这一层操作;
3)返回结果。
ListNode* reverseList(ListNode* head) {
if (head->next == nullptr || head == nullptr)
{
return head;
}
ListNode* reverse = reverseList(head->next);
head->next->next = head;
head->next = nullptr;
return reverse;
}