内容:Reverse a singly linked list.
A linked list can be reversed either iteratively or recursively. Could you implement both?
LinkedList定义
public class ListNode {
public int val;
public ListNode next;
public ListNode(int x) { val = x; }
}
总思路图:
递归思路:
递归函数内除了递归调用函数以外,还需要做两件事:1 反转指针的指向; 2 返回新的链表头;
非递归思路
1 使用dummy节点;
2 初始化时,dummy.next指向head;
3 并从第2个节点开始遍历,把遍历过的节点依次插入在dummy节点后;
4 最后,返回dummy.next即可。
public static ListNode reverseListNonRecursive(ListNode head)
{
// 新建一个dummy
ListNode dummy = new ListNode(0);
// dummy指向头部,即dummy再head前面
dummy.next = head;
// 边界条件;如果head或者head.next是null,直接返回head;
if (head == null || head.next == null)
return head;
// 从第2个node开始遍历;原因:head.next下一步将需要设置为null
ListNode curr = head.next;
//head.next置为null
head.next = null;
//从2号node开始遍历,实施如下动作:1 curr.next前指; 2 dummy.nexe指向curr; 3 curr后移
while (curr != null)
{
//存储curr的next,为curr后移做准备
ListNode tmp = curr.next;
//1 curr.next前指
curr.next = dummy.next;
//dummy.nexe指向curr
dummy.next = curr;
//3 curr后移
curr = tmp;
}
//返回dummy.next
return dummy.next;
}