[剑指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;
}
经验分享 程序员 微信小程序 职场和发展