反转单链表
LeetCode92
单链表的结构为:
// 单链表节点的结构
public class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
1. 迭代实现法
这里用一张人家画好的图,思想是定义三个节点pre、nxt、cur,cur节点表示当前的节点,nxt记录院链表中cur的下一个节点,pre初始化为null,首先让头节点指向pre,cur和pre都向后移动一位,接着让cur一直指向pre,重复此操作,当cur为空时链表就被成功反转了,此时返回链表的头节点pre。
代码如下:
public LinkNode reverse(LinkNode head){
LinkNode pre = null;
LinkNode cur = head;
LinkNode nxt = null;
while(cur != null){
nxt = head.next;
cur.next = pre;
pre = cur;
cur = nxt;
}
return pre;
}
2. 递归实现法
先上代码:
ListNode reverse(ListNode head) {
if (head.next == null) return head;
ListNode last = reverse(head.next);
head.next.next = head;
head.next = null;
return last;
}
对于递归法,最重要的是明确函数的定义,这个函数的定义是:**给你链表的头指针,将整个链表反转并且返回链表的头指针。**因此就有了这行代码:
ListNode last = reverse(head.next);
本来链表是这样的:
执行了这行代码后链表就变成了这样,因为我们是对以head.next为头节点进行反转:
接下来执行下面这行代码,链表就变成了这样:
head.next.next = next
head.next是2这个节点,head.next.next=head就是把2这个节点的下一个节点变成了1,成功干掉了2后面的null。最后记得令head指向null,链表就被反转了。返回的头节点用last接收。
head.next = null;
return last;
递归法总结:脑子里牢记函数的定义,不要管它具体怎么实现!