Reverse a singly linked list.
代码
ReverseLinkedList.java
package list;
public class ReverseLinkedList {
/**
* 描述 Reverse a singly linked list.
*
* 1. 调转指针解法(非递归)
* 用三个指针 prev,cur,next ,紧紧相邻,不断前进,每次将 cur.next 指向 prev ,将 prev指向cur, cur 指向 next 。
*/
public ListNode Solution1(ListNode head){
if(head == null || head.next == null)
return head;
ListNode prev = null;
ListNode cur = head;
while(cur != null){
ListNode next = cur.next;
cur.next= prev;
prev = cur;
cur = next;
}
return prev;
}
/**
* 描述 Reverse a singly linked list.
*
* 2. recursive 递归解法
*
*/
public ListNode Solution2(ListNode head){
if(head == null || head.next == null)
return head;
ListNode cur = head;
ListNode ret = recurList(cur.next);
ListNode tmp = ret;
while (tmp.next != null)
tmp = tmp.next;
tmp.next = head;
head.next = null;
return ret;
}
private ListNode recurList(ListNode head) {
if (head == null || head.next == null)
return head;
ListNode tail = Solution2(head);
return tail;
}
}
测试
ReverseLinkedListTest
package list;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class ReverseLinkedListTest {
private ReverseLinkedList s;
@Before
public void setUp() {
s = new ReverseLinkedList();
}
@Test
public void testSolution1() {
ListNode one = new ListNode(1);
ListNode two = new ListNode(2);
ListNode three = new ListNode(3);
ListNode four = new ListNode(4);
ListNode five = new ListNode(5);
one.next = two;
two.next = three;
three.next = four;
four.next = five;
ListNode result = s.Solution1(one);
// Assert.assertEquals(expect, result);
ListNode tmp = result ;
while (tmp!= null){
System.out.println(tmp.val);
tmp = tmp.next;
}
}
@Test
public void testSolution2() {
ListNode one = new ListNode(1);
ListNode two = new ListNode(2);
ListNode three = new ListNode(3);
ListNode four = new ListNode(4);
ListNode five = new ListNode(5);
one.next = two;
two.next = three;
three.next = four;
four.next = five;
ListNode result = s.Solution2(one);
// Assert.assertEquals(expect, result);
ListNode tmp = result ;
while (tmp!= null){
System.out.println(tmp.val);
tmp = tmp.next;
}
}
}
结果
5
4
3
2
1
5
4
3
2
1