题目复习反转链表
字节面试的一道面试考题。属于简单题,毕竟复杂的面试也不好判题对吧(狗头)
思路
思路不难,首先我们观察链表,一般链表指的都是单向链表
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;
}