leetcode 每日一题 206. Reverse Linked List


反转链表的题目,比较基础,但是很容易蒙


我的这种方法是建立一个头,然后一个一个反转


 每次都将原第一个结点之后的那个结点放在list后面,下图是原始的单链表。单链表反转示例图片

为了反转这个单链表,我们先让头结点的next域指向结点2,再让结点1的next域指向结点3,最后将结点2的next域指向结点1,就完成了第一次交换,顺序就变成了Header-结点2-结点1-结点3-结点4-NULL,然后进行相同的交换将结点3移动到结点2的前面,然后再将结点4移动到结点3的前面就完成了反转

原文地址:http://www.cnblogs.com/pianoid/archive/2011/05/03/reverse-a-singly-linked-list.html


class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* curr= head;
        ListNode* tmp;
        ListNode* first = new ListNode(2);
                
        if(head==NULL) return NULL;
        
        first->next = curr;
        
        while(curr->next!=NULL){
            tmp=curr->next;
            curr->next=tmp->next;
            tmp->next=first->next;
            first->next=tmp;
        }
        
        return first->next;
    }
};

最后注意的是,返回的时候要返回first->next而不是head,因为head变了···


另一种方法更加巧妙,是原地改变head变成一个新的链表


  ListNode* reverseList(ListNode* head) 
    {
        ListNode* prev = NULL;
        
        while (head != NULL)
        {
            ListNode* next = head->next;
            head->next = prev;
            prev = head;
            head = next;
        }
        
        return prev;
    }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值