【力扣】LeetCode 206 反转链表

一、题目描述如下:

【力扣】LeetCode 206 反转链表_第1张图片

二、题目链接:

力扣 209 长度最小的子数组 链接:link

三、解题思路:

  • 思路一:用三个指针直接在当前链表上操作,每次将 n2->next的值改成 n1,不断往后迭代,直到 n2 为空。
    【力扣】LeetCode 206 反转链表_第2张图片
    代码实现如下:
struct ListNode* reverseList(struct ListNode* head){

    if (head == NULL)
        return NULL;

    // 思路1:用三个指针来改变链表的指向
    struct ListNode* n1 = NULL, *n2 = head, *n3 = head->next;
    
    while (n2 != NULL)
    {
        n2->next = n1;
        n1 = n2;
        n2 = n3;
        if (n3 != NULL)	// 注意判断 n3 为空的情况
            n3 = n3->next;
    }
    return n1;
}
  • 思路二:从原链表中依次取下节点在新链表中进行头插。【力扣】LeetCode 206 反转链表_第3张图片
    指针移动变化的过程如下:
    【力扣】LeetCode 206 反转链表_第4张图片
    指针移动变化的过程如下:
    【力扣】LeetCode 206 反转链表_第5张图片
    代码实现如下:
struct ListNode* reverseList(struct ListNode* head){
    // 思路二: 将每个节点拿下来头插
    struct ListNode* cur = head, * newhead = NULL;

    while (cur != NULL)
    {
        struct ListNode* next = cur->next;  // 记录下一个节点

        // 头插
        cur->next = newhead;
        newhead = cur;
        // 迭代
        cur = next;
    }
    return newhead;
}

四、总结

数据结构的题目,应该多画图去分析,增强自己调试代码的能力。

你可能感兴趣的:(力扣刷题,leetcode,链表,数据结构)