翻转链表

反转链表

http://www.nowcoder.com/questionTerminal/75e878df47f24fdc9dc3e400ec6058ca

本题要求将单链表翻转,我开始的思路是,链表翻转即将最后一个节点作为首节点,然后从后往前依次递推,但很快我发现这很不显示,因为这样需要每次都选择到当前链表的最后一个节点,把它从链表中拿出来,然后再取出倒数第二个节点……这样的时间复杂度就有n^2了

参考了一下牛客官方的题解,我发现我忽略了链表自身的特性,即创建链表不一定就用尾插法,也可以采用首插法,而本题在已经给出的链表的情况下,采用首插法将大大降低复杂度

首插法的方法,就是取出现需要处理链表的头结点,作为我们需要翻转链表的头结点,那么按照这样的操作,需要处理链表的尾节点就是它的头结点

思路很简单,需要注意的也就是三个位置,1.需要处理链表的头部,定义pHead指向它,2.需要处理链表的第二个节点定义next指向它(方便后续操作),3.所得翻转链表的头部,定义pre指向它;

代码如下

class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        if(!pHead) return nullptr;
        ListNode* pre,* next;
        pre = pHead;
        next = pHead->next;
        pre->next = nullptr;
        while(next){
            pHead = next;    //新一***作中原有的第二个节点即为原链表的首节点
            next = pHead->next;
            pHead->next = pre;    //将该头结点指向所得翻转链表头部
            pre = pHead;    //更新头部位置
        }
        return pre;
    }
};
全部评论

相关推荐

抱抱碍事梨a:三点建议,第一点是建议再做一个项目,把自我介绍部分顶了,第二点是中南大学加黑加粗,第三点是建议加v详细交流
点赞 评论 收藏
分享
野猪不是猪🐗:现在的环境就是这样,供远大于求。 以前卡学历,现在最高学历不够卡了,还要卡第一学历。 还是不够筛,于是还要求得有实习、不能有gap等等... 可能这个岗位总共就一个hc,筛到最后还是有十几个人满足这些要求。他们都非常优秀,各方面都很棒。 那没办法了,看那个顺眼选哪个呗。 很残酷,也很现实
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务