[剑指offer 24] 反转链表
题目复习反转链表
字节面试的一道面试考题。属于简单题,毕竟复杂的面试也不好判题对吧(狗头)
思路
思路不难,首先我们观察链表,一般链表指的都是单向链表
struct ListNode { int val; struct ListNode *next; };
那么我们其实遍历到子节点next以后找不到父节点的。 所以要反转的话,最通俗的思路,就是遍历,放到数组里,反向输出。 另有一题也可以这么做。 但这样会开辟额外的内存空间。
在相同时间要求的情况下,如果不需要保留原始链表,我们可以通过三个指针来完成。本体C和C++代码基本一样,无非就是C++ 可以不用写struct关键字而已。 核心思路就是,写三个指针,一个保存子节点next,一个保存当前节点cur,另一个保存当前节点的父节点(爷节点?)。 然后按照下述伪代码步骤
// 先把next存起来, next = listnode->next // 然后把cur的子节点指向pre cur->next = pre // 然后右移pre,把pre指向cur pre = cur // 最后右移cur,cur = next // 结束条件:当cur指到 NULL时候说明结束了, 这时候,prev表示的是最后一节点,也就是输出的head节点。
C代码
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* reverseList(struct ListNode* head) { struct ListNode* prev = NULL; struct ListNode* curr = head; while (curr) { struct ListNode* next = curr->next; curr->next = prev; prev = curr; curr = next; } return prev; }