C语言刷题 LeetCode 30天挑战 (八)快慢指针法

//Middle of the Linked List

//Given a non-empty, singly linked list with head node head ,

//return a middle node of linked list.

//If there are two middle nodes, return the second middle node

//Example 1:

//Input:1,2,3,4,5]

//0utput:Node 3from this list(Serialization:[3,4,5])

//The returned node has value 3, (The judge's serialization of this node is [3,4,5]).

//Note that we returned a ListNode object ans, such that:

//ans,val =3,ans.next,val =4,ans.next,next.val = 5, and ans.next.next.next = NULL.

//Example 2:

//Input:I[1,2,3,4,5,6]

//Output:Node 4 from this list(serialization:[4,5,6])

//Since the list has two middle nodes with values 3 and 4, we return the second one.

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>

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

// Function to find the middle node
struct ListNode* middleNode(struct ListNode *head) {
    struct ListNode *slow = head;
    struct ListNode *fast = head;

    // Move slow pointer one step and fast pointer two steps
    while (fast != NULL && fast->next != NULL) {
        slow = slow->next;
        fast = fast->next->next;
    }
    
    // When fast reaches the end, slow is at the middle
    return slow;
}

// Helper function to create a new ListNode
struct ListNode* createNode(int val) {
    struct ListNode* newNode = (struct ListNode*) malloc(sizeof(struct ListNode));
    newNode->val = val;
    newNode->next = NULL;
    return newNode;
}

// Helper function to print the linked list from a given node
void printList(struct ListNode* node) {
    while (node != NULL) {
        printf("%d ", node->val);
        node = node->next;
    }
    printf("\n");
}

int main() {
    // Example 1: [1, 2, 3, 4, 5]
    struct ListNode* head = createNode(1);
    head->next = createNode(2);
    head->next->next = createNode(3);
    head->next->next->next = createNode(4);
    head->next->next->next->next = createNode(5);
    
    struct ListNode* middle = middleNode(head);
    printf("Middle node value: %d\n", middle->val);
    printf("List from middle node: ");
    printList(middle);
    
    // Example 2: [1, 2, 3, 4, 5, 6]
    struct ListNode* head2 = createNode(1);
    head2->next = createNode(2);
    head2->next->next = createNode(3);
    head2->next->next->next = createNode(4);
    head2->next->next->next->next = createNode(5);
    head2->next->next->next->next->next = createNode(6);
    
    middle = middleNode(head2);
    printf("Middle node value: %d\n", middle->val);
    printf("List from middle node: ");
    printList(middle);

    return 0;
}
相关推荐
开心工作室_kaic12 分钟前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
向宇it14 分钟前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
武子康19 分钟前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神1 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
搬砖的小码农_Sky1 小时前
C语言:数组
c语言·数据结构
宅小海1 小时前
scala String
大数据·开发语言·scala
朝九晚五ฺ1 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
qq_327342731 小时前
Java实现离线身份证号码OCR识别
java·开发语言
锅包肉的九珍1 小时前
Scala的Array数组
开发语言·后端·scala
自由的dream1 小时前
Linux的桌面
linux