题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。
思路:
在单链表的表头临时接入一个节点,然后进行尾插法操作。反转单链表。
测试用例
最好就是提前想好测试用例,写出代码以后再用事先准备好的测试用例进行检查测试。
- 功能测试(输入的链表含有多个结点、只有一个结点)
- 特殊输入测试(链表头结点为null)
代码实现
public class ReverseList {
public static void main(String[] args) {
ListNode head = new ListNode();
head.value = 1;
head.next = new ListNode();
head.next.value = 2;
head.next.next = new ListNode();
head.next.next.value = 3;
head.next.next.next = new ListNode();
head.next.next.next.value = 4;
head.next.next.next.next = new ListNode();
head.next.next.next.next.value = 5;
head.next.next.next.next.next = new ListNode();
head.next.next.next.next.next.value = 6;
head.next.next.next.next.next.next = new ListNode();
head.next.next.next.next.next.next.value = 7;
head.next.next.next.next.next.next.next = new ListNode();
head.next.next.next.next.next.next.next.value = 8;
head.next.next.next.next.next.next.next.next = new ListNode();
head.next.next.next.next.next.next.next.next.value = 9;
printList(head);
head = reverseList(head);
printList(head);
head = reverseList(head);
printList(head);
}
private static class ListNode{
int value;
ListNode next;
}
/**
* @param head 链表的头结点
* @return 反转后的链表的头结点
*/
private static ListNode reverseList(ListNode head){
ListNode reverseHead=null;//记录反转链表后的头结点
ListNode curNode=head;//记录当前处理结点
ListNode preNode=null;//记录当前结点的前驱结点
while(curNode!=null){
ListNode next=curNode.next;//事先保存当前结点的下一个结点以防止链表断开
if(next==null){
reverseHead=curNode;//当然如果当前结点已经是最后一个结点了那么反转链表的头结点就是当前结点
}
curNode.next=preNode;//当前结点指向前一个结点
preNode=curNode;
curNode=next;
}
return reverseHead;
}
private static void printList(ListNode head){
while(head!=null){
System.out.print(head.value+"->");
head=head.next;
}
System.out.println("null");
}
}
结果:
1->2->3->4->5->6->7->8->9->null
9->8->7->6->5->4->3->2->1->null
1->2->3->4->5->6->7->8->9->null