一.题目
输入一个链表,反转链表后,输出链表的所有元素。
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
二.分析
参考 剑指Offer—面试题15:链表中的倒数第k个节点一文中的分析,这道题目也就是面试题15所体现出来的思想的一种变种; 也是巧用指针解决链表问题的扩展.
三.代码
public ListNode ReverseList(ListNode head) {
if(head==null||head.next==null){
return head;
}
ListNode oldNode=head;
ListNode newNode=oldNode.next;
ListNode tmpNode=newNode.next;
while(tmpNode!=null){
if(oldNode==head){
oldNode.next=null;
}
newNode.next=oldNode;
oldNode=newNode;
newNode=tmpNode;
tmpNode=tmpNode.next;
}
if(tmpNode==null){
newNode.next=oldNode;
}
return newNode; //注意最后返回的结点应该是原链表的尾节点,新链表的头结点
}
在最后返回值上吃了憋,一开始一直return head;
检查半天没发现错误…蠢哭了.
四.测试数据
就测试数据来说,我们一般从三方面保证代码的完整性:
功能测试
边界测试
负面测试
在这个题目中,测试数据我们可以这样去准备,
- 输入的链表有多个结点
- 输入的链表只有一个结点
- 输入的链表头指针是
NULL
五.扩展
采用递归的方法解答上诉问题.
直接上代码
public ListNode ReverseList(ListNode head) {
if(head==null||head.next==null){
return head;
}
//先翻转后面的链表,走到链表的末端结点
ListNode reverseNode=ReverseList(head.next);
//将当前节点设置为后面结点的后续结点
head.next.next=head;
head.next=null;
return reverseNode; //注意最后返回的结点应该是原链表的尾节点,新链表的头结点
}