[剑指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;
}
