0.题目
反转一个单链表
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
1.解法:迭代法 0ms 38.3MB
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode cur = reverseList(head.next);
head.next.next = head;
head.next = null;
return cur;
}
2. 解法:双指针法 0ms 38.3MB
public ListNode reverseList(ListNode head) {
ListNode cur = null;
ListNode pre = head;
while (pre != null) {
ListNode temp = pre.next;
pre.next = cur;
cur = pre;
pre = temp;
}
return cur;
}
3.分析
反转的顺序有两种,从前往后转,对应双指针法;从后往前转,对应迭代方法;
3.1 简单的双指针法
说明
cur指针初始为null,每次循环都往后移动一个节点;pre指针初始为原始链表的头结点,每次往后移动一个节点。循环的过程:
- 先断开当前节点pre与后面节点的关系,即temp = pre.next;
- 把当前节点pre的next指向cur,达到反向的目的,即pre.next = cur;
- cur和pre节点都往前移动一个节点,即cur=pre;pre = temp;
3.2 难懂的迭代法
说明
如果理解第一种双指针解法,那么第二种也不难理解;就简单的从最后一个节点断链,反向指向前面一个节点;实现方式就是迭代。
迭代退出的条件是遍历到最后一个节点;即head==null || head.next == null;then return head;
遍历末尾之后,需要开始断链以及重新指向节点;这个过程比较难理解。