单链表---链表逆置(反转)

方法一---将各next指针指向反转

struct ListNode
{
    int val;
    struct ListNode* next;
};

由于链表物理上不连续,各个结点通过结点中的next指针所链接,反转指针指向,意味着后一个结点的位置需要记录,那么我们就需要一个next指针用于记录每次前两个指针反转后的后一个指针。而创建prev与cur指针用于反转指向,每次反转后通过next指针就能够移动prev与cur指向的位置。

    struct ListNode* prev = NULL;
    struct ListNode* cur = head;
    struct ListNode* next = cur->next;

    if (head == NULL)
        return NULL;
    while (cur)
    {
        cur->next = prev;
        prev = cur;
        cur = next;
        if (next)//next不为空才能解引用
            next = next->next;
    }
    return prev;

方法二---新建链表,遍历原链表将每个结点头插入新链表

    struct ListNode* newhead = NULL;
    struct ListNode* cur = head;

头插,每次遍历将结点插入到最前面,那么最后就将原链表反转。由于插入进来会改变每个结点的next指针指向,那么需要额外创建一个next指针,用于记录下一个结点位置,我们在循环内部创建即可,因为每次循环next都指向下一个待插入的结点,同时next也不会非法访问,因为cur为空停止循环。

    while (cur)
    {
        struct ListNode* next = cur->next;
        cur->next = newhead;
        newhead = cur;
        cur = next;
    }
    return newhead;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值