题解 | #反转链表#

反转链表

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

原地反转:反转的时候,我们最笨的方法思考也要知道当前节点,后继节点和前驱节点。
所以我们先用三个指针来保存到这三个节点。
这题目最终的一步就是转化方向的代码
因为每次反转的时候,我们的三个指针都已经保存了,当前节点,后继节点和前驱节点。
所以,在写代码的时候我们只需要考虑反转后,指针传递顺序即可。

type Node struct{
    val int
    nextNode *Node
}

func Reverse(node *Node) *Node {
    // 判断边界
    if node == nil ||node.nextNode ==nil {
        return node
    }
    // 初始化三个指针
    var pre *Node //声明不初始化,则pre是nil
    cur := node  //很明显,给的指针在头节点也是存数数据的。
    next := node.nextNode
    for next != nil {
        // 直接反转当前链表
        cur.nextNode = pre
        // 注意链表前进顺序,从pre往next依次前进
        pre = cur
        cur = next
        next = next.nextNode
    }
    // 因为反转操作都是在循环中,当next指针是空的时候,最后一个节点实际上是没有反转的,所以在最外层我们讲最后一个节点反转即可
    cur.nextNode = pre
    return cur
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务