剑指Offer_16 反转链表
2018/5/21 星期一
题目:定义一个函数,输入一个链表的头结点,反转该链表并且输出反转后链表的头结点。链表结点定义如下:
class ListNode { int data; ListNode nextNode; }
分析:在图(a)所在的链表中,h,i,j是3个相邻的结点。
假设经过若干个操作后,h结点前面的反转已经完成。如果此时将i指向h,那么在i和j之间将会出现断裂。
为了解决这个问题,我们就需要记录下i结点之前,将j结点保存下来。整理上述步骤如下:
- 保存j结点;
- 更改i结点指针,指向h结点;
- 移动前一个值元素指针指向i;
- 移动现在元素指针指向j。
Java代码实现如下:
public ListNode reverseList(ListNode head) {
if (head == null) {
return null;
}
ListNode preListNode = null;
ListNode nowListNode = head;
while (nowListNode.nextNode != null) {
ListNode nextListNode = nowListNode.nextNode;
nowListNode.nextNode = preListNode;
preListNode = nowListNode;
nowListNode = nextListNode;
}
return nowListNode;
}
程序需要考虑如下问题:
- 输入链表为空,或者整个链表只有一个结点
- 反转后的链表出现断裂
- 返回的反转之后的链表不是原始链表的尾结点。
测试用例:
- 功能测试:输入的链表中含有多个结点;链表中只有一个结点
- 特殊功能测试:输入的链表结点为NULL指针。