206&&92. Reverse Linked List (反转链表)1&&2

一、反转链表1

1.c++解法

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode *new_head=NULL;
        while(head){
            ListNode *next=head->next;
            head->next=new_head;
            new_head=head;
            head=next;
        }
        return new_head;
    }
};

刚开始看刷题班老师的代码,一直没想明白head->next=new_head是个啥,后来突然明白了,你把new_head想象成pre结点,所谓的反转就是后面的指向前面,一个一个改过来就好了。

 

 

二、反转链表2

1、c++解法

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseBetween(ListNode* head, int m, int n) {
        int node_num=n-m+1;//计算需要逆置的结点个数
        ListNode *pre_head=NULL;//开始逆置的节点的前驱 
        ListNode *result=head;//最终转换后的链表头结点,除了m=1时要特殊考虑,说明从第一个结点开始逆置
        while(head&&--m){//将head向前移动到开始逆置的位置m,也就是移动了m-1个位置
            pre_head=head;//记录head的前驱
            head=head->next;
        }
        ListNode *tail=head;//尾部记录的是逆置之前的头部
        ListNode *pre=NULL;//pre记录要逆置的头结点的前驱;
        ListNode *next=NULL;
        while(head&&node_num){
            next=head->next;
            head->next=pre;
            pre=head;
            head=next;
            node_num--;
        }
        tail->next=head;//此时head通过前面的while循环已经到达了逆置的最后一个结点n的next结点
        if(pre_head){//不为空说明不是从第一个结点开始逆置
            pre_head->next=pre;
        }
        else{
            result=pre;
        }
        return result;
    }
};

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值