题解 | #反转链表#
反转链表
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 }