反转链表
题目:
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
准备工作,定义一个ListNode类,作为结点类型:
public class ListNode { int val; ListNode next; ListNode(int x) { val = x; } }
解法一:头插法
遍历给定的单链表,然后定义一个Listnode类型的辅助变量,每遍历到一个结点就将该结点赋值给辅助变量,然后指针变量向后移动,将辅助变量指向的结点插入到最前面。
public ListNode reverseList(ListNode head) { if (head == null || head.next == null){ return head; } ListNode p = head; ListNode q = null; ListNode temp = null; while (p!=null){ temp = p; p = p.next; temp.next = q; q = temp; } return q; }
解法二:递归解决
反转就是将第一个结点变为最后一个结点,第二个结点变为倒数第二个结点,依次类推,那么可以可采用地递归的方式进行逐个的反转。我们可以将第一个结点后面的所有结点看成一个整体,那么反转就是将第一个结点和后面那个整体调换位置,同样,在这个整体的内部也需要进行反转,那么原始链表中的第二个结点,在当前的这个除第一个结点之外的整体内部算是第一个结点,继续上面的操作,可以达到逐层反转的目的。
public ListNode reverseList(ListNode head) { if (head == null || head.next == null) { return head; } ListNode p = head.next; ListNode q = reverseList(p); p.next = head; head.next = null; return q; }