Bootstrap

数据结构 | 题目练习第一章 | 链表 | 反转链表 | 链表的中间节点

一、反转链表

原链接:https://leetcode.cn/problems/reverse-linked-list/

image-20241031162353336

思路一:翻指针

  1. 需要先保存下一个指针,否则翻转后找不到下一个指针
  2. 迭代到最后那n1就是头
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* reverseList(struct ListNode* head) {
    // 判断head == NULL,等于空则返回空
    if(head == NULL){
        return NULL;
    }
    
    // 初始条件
    struct ListNode* n1 = NULL,*n2 = head,*n3= n2->next;
    // 结束条件
    while(n2){
        // 迭代
        n2->next = n1;
        n1 = n2;
        n2 = n3;
        // 如果n3为空了就不
        if(n3){
        n3 = n3->next;
        }
    }
    // n1 就是最后链表的头
    return n1;
    
}

图解

image-20241031175443112

image-20241031175453190

**思路二:**头插法

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

struct ListNode* reverseList(struct ListNode* head) {
    struct ListNode* cur = head;
    // 定义新节点 
    struct ListNode* newHead = NULL;
    while(cur){
        // 提前保存下一个
         struct ListNode* next = cur->next;
        // 头插
        cur->next = newHead;
        newHead = cur;
        cur = next;
        }
        // 最后newhead就是第一个元素
        return newHead;
}

图解

image-20241031213815704

image-20241031213714633

image-20241031213726833

image-20241031214000360

二、链表的中间节点

原链接:https://leetcode.cn/problems/middle-of-the-linked-list/description/

image-20241031224624533

**思路一:**快慢指针

图解

image-20241031224745781

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* middleNode(struct ListNode* head) {
    
    struct ListNode* slow = head,*fast = head;
    
    // fast和fast->next都不等于空才结束
    while(fast && fast->next){
        // slow 走一步
        slow = slow->next;
        // fast 走两步
        fast = fast->next->next;

    }
    return slow;
}
;