剑指offer之反转链表

简介: 剑指offer之反转链表

1 问题

反转链表,比如0->1->2->3反转后变成了3->2->1->0


2 分析

搞3个指针,初始化一个指针,让头结点指向这里,然后另外一个指针初始化为NULL,然后让第一个节点指向这里,然后头结点依次向右移,这个初始化为NULL的指针也向右移动,然后最后当头结点的next指向NULL的时候,我们直接返回这个节点就行了。


3 代码实现

#include <stdio.h>
typedef struct Node
{
    int val;
    struct Node *next;
} Node;
/*
 *print list
 */
void print_list(Node *head)
{
    if (head == NULL)
    {
        printf("head is NULL\n");
        return;
    }
    Node *p = head;
    while (p != NULL)
    {
        printf("value is %d\n", p->val);
        p = p->next;
    }
}
/*
 *reverse list
 */
struct Node* reverse(Node *head)
{
    if (head == NULL)
    {
        printf("reverse head is NULL\n");
        return NULL;
    }
    Node *end = NULL;
    Node *p = head;
    Node *start = NULL;
    while (p != NULL)
    {
        //next node
        Node *next = p->next;
        //If next is NULL, we will store p, we will return p in the end;
        if (next == NULL)
        {
            end = p;
        } 
        p->next = start;
        start = p;
        p = next;
    }
    return end;
}
int main()
{
    //0->1->2->3;
    Node head, node1, node2, node3;
    head.val = 0;
    head.next = &node1;
    node1.val = 1;
    node1.next = &node2;
    node2.val = 2;
    node2.next = &node3;
    node3.val = 3;
    node3.next = NULL;
    print_list(&head);
    printf("list will reverse\n");
    Node *hello = reverse(&head);
    print_list(hello);
    return 0;
}

4 运行结果

value is 0
value is 1
value is 2
value is 3
list will reverse
value is 3
value is 2
value is 1
value is 0



相关文章
|
8月前
《剑指offer》——合并两个排序的链表
《剑指offer》——合并两个排序的链表
|
8月前
剑指 Offer 35:复杂链表的复制
剑指 Offer 35:复杂链表的复制
54 0
|
3月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
61 0
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
63 5
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 18. 删除链表的节点
Leetcode题目"剑指 Offer 18. 删除链表的节点"的Python解决方案,通过使用双指针法找到并删除链表中值为特定数值的节点,然后返回更新后的链表头节点。
51 4
|
8月前
|
Java C语言
剑指offer(牛客)——合并两个排序的链表
剑指offer(牛客)——合并两个排序的链表
54 1
|
8月前
|
存储 Java C语言
剑指offer(牛客)——从尾到头打印链表
剑指offer(牛客)——从尾到头打印链表
50 1
|
8月前
【一刷《剑指Offer》】面试题 17:合并两个排序的链表
【一刷《剑指Offer》】面试题 17:合并两个排序的链表
|
8月前
【一刷《剑指Offer》】面试题 16:反转链表
【一刷《剑指Offer》】面试题 16:反转链表
|
8月前
【一刷《剑指Offer》】面试题 15:链表中倒数第 k 个结点
【一刷《剑指Offer》】面试题 15:链表中倒数第 k 个结点