[LeetCode]206. Reverse Linked List(反转单链表)

206. Reverse Linked List

Reverse a singly linked list.
反向单链表。
Hint:
A linked list can be reversed either iteratively or recursively. Could you implement both?
提示:
可以迭代或递归地颠倒链表

思路1:

  • 现将链表变成环,每次都将原第一个结点之后的那个结点放在新的表头后面,最后断开环。
  • 比如1,2,3,4,5 变成1,2,3,4,5->1(环)
  • 第一次:把第一个结点1后边的结点2放到新表头后面,变成2,1,3,4,5 ->2(环)
  • 第二次:把第一个结点1后边的结点3放到新表头后面,变成3,2,1,4,5 ->3(环)
  • 4,3,2,1,5 ->4(环)
  • 5,4,3,2,1 ->5(环)

    代码如下:

ListNode* reverseList(ListNode* head) {
        if(head == nullptr || head->next == nullptr)
            return head;
        ListNode* res;
        ListNode* first;
        ListNode* temp;
        res = new ListNode(-1);
        res->next = head; //将单链表变成环
        first = head;//指向原链表的头结点
        while(first->next != nullptr){
            temp = first->next;//指向即将处理的点
            first->next = temp->next;
            temp->next = res->next;
            res->next = temp;
        }
        head = res->next;
        res->next = nullptr;
        return head;
    }

思路2:

代码如下:

ListNode* reverseList(ListNode* head) {
        if(head == nullptr || head->next == nullptr)
            return head;
        ListNode* p;
        ListNode* q;
        ListNode* r;
        p = head;
        q = head->next;
        head->next = nullptr;//旧的头指针是新的尾指针 指向NULL
        while(q){
            r = q->next;//用来保存下一步要处理的指针
            q->next = p;//p q 交替处理 进行反转单链表
            p = q;
            q = r;
        }
        head = p;//最后的q必定指向NULL,p就成了新链表的头指针
        return head;
    }

思路3:

  • 递归,参考链接
  • 现在需要把A->B->C->D进行反转,
  • 可以先假设B->C->D已经反转好,已经成为了D->C->B,那么接下来要做的事情就是将D->C->B看成一个整体,让这个整体的next指向A,所以问题转化了反转B->C->D。那么,
  • 可以先假设C->D已经反转好,已经成为了D->C,那么接下来要做的事情就是将D->C看成一个整体,让这个整体的next指向B,所以问题转化了反转C->D。那么,
  • 可以先假设D(其实是D->NULL)已经反转好,已经成为了D(其实是head->D),那么接下来要做的事情就是将D(其实是head->D)看成一个整体,让这个整体的next指向C,所以问题转化了反转D。

代码如下:

ListNode* reverseList(ListNode* head) {
        if (!head || !(head -> next)) return head;
        ListNode* node = reverseList(head -> next);
        head -> next -> next = head;
        head -> next = NULL;
        return node; 
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值