题目及测试
package sword016;
/* 问题描述:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。
*/
public class main {
public static void main(String[] args) {
LinkList a=new LinkList(1);
a.addLast(2);
a.addLast(3);
a.addLast(4);
a.addLast(5);
a.printList();
test(a.first);
LinkList b=new LinkList(5);
b.addLast(6);
b.addLast(4);
b.addLast(2);
b.addLast(1);
b.addLast(3);
b.printList();
test(b.first);
}
private static void test(ListNode ito) {
Solution solution = new Solution();
ListNode rtn;
long begin = System.currentTimeMillis();
System.out.println();
//开始时打印数组
rtn=solution.getReverseListHead(ito);//执行程序
long end = System.currentTimeMillis();
System.out.println("rtn=");
rtn.printNodeToEnd();
//System.out.println(":rtn" );
//System.out.print(rtn);
System.out.println();
System.out.println("耗时:" + (end - begin) + "ms");
System.out.println("-------------------");
}
}
解法1(成功)
对于一个链表,我们只能从头往后遍历,如果要反转,我们需要更改当前节点的next域指向前一个节点,此时链表断开,为了能继续修改下一个节点的next域,我们还要维护下一个节点。
package sword016;
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode getReverseListHead(ListNode head) {
ListNode newHead = null;
while(head != null) {
ListNode next = head.next;
head.next = newHead;
newHead = head;
head = next;
}
return newHead;
}
}