如何反转一个链表

最近在刷Leetcode中关于链表的题,发现很多题都涉及到了了链表的反转

给出一个链表[1, 2, 3, 4, 5]
反转为[5, 4, 3, 2, 1]

解决该问题可以用循环解决,而核心思想便是在循环中每次只让第I个元素插入到链表的头部
在循环之前链表长这样

1-> 2-> 3-> 4-> 5

第一次循环

2-> 1-> 3-> 4-> 5

第二次循环

3-> 2-> 1-> 4-> 5

如何写代码来解决?
对于上述过程,很显然我们需要一个指针一直指向头部之前的一位,构造一个链表长这样

NULL-> 1-> 2-> 3-> 4-> 5

利用指针一直指向NULL这个值
然后再利用一个指针指向1这个值

完整代码

struct ListNode* reverseList(struct ListNode* head) {
    if (head == NULL || head->next == NULL)
        return head;
    struct ListNode* prev = (struct ListNode*)malloc(sizeof(struct ListNode));
    prev->next = head;
    struct ListNode* curr = head;
    while (curr->next != NULL) {
        struct ListNode* next = curr->next;
        curr->next = next->next;
        next->next = prev->next;
        prev->next = next;
    }
    return prev->next;
}

第一次循环

NULL-> 1-> 2-> 3-> 4-> 5
  |    |   |
prev  curr next

第二次循环

NULL-> 2-> 1-> 3-> 4-> 5
  |        |   |
prev     curr  next


可以把上述代码粘贴到 Leetcode 206. Reverse Linked List 跑一跑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值