反转链表
题目
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶: 你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
思路
有很多种写法:
1)迭代方式的解答
为了完成这个任务,需要记录链表中三个连续的节点:reverse、head、second。在每一轮迭代中,从原始链表中提取节点head并将它插入到逆链表的开头。我们需要一直保持head指向原链表中所有剩余节点的首节点,second指向原链表中所有剩余节点的第二个节点,reverse指向结果链表中的首节点。
2)假设链表有N个节点,首先递归颠倒最后N-1个节点,然后小心地将原链表的首节点插入到结果链表的末端。
java代码
迭代和递归写法,见代码注释。
1 | /** |
总结
- 编写和链表相关的代码时,必须要小心处理异常情况(链表为空或是只有一个或两个节点)和边界情况(处理首尾节点)。这些情况通常更加需,要画图等手段来看清楚指针变化。