目录
反转链表
描述
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例
输入
1->2->3->4->5->NULL
输出
5->4->3->2->1->NULL
限制
0 <= 节点个数 <= 5000
数据结构
public class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
方法一:迭代
我们使用三个指针,分别指代当前指针的pre(前一个节点)、cur(当前节点)、next(当前节点的next节点)
然后从头节点开始遍历,将cur.next用next节点保存,接着将cur.next=pre,然后更新pre和cur(pre=next,cur=next),循环出口是cur为空节点。
class Solution {
public ListNode reverseList(ListNode head) {
if (head==null || head.next==null){
return head;
}
ListNode pre=null;
ListNode cur=head;
ListNode next;
while(cur!=null){
next=cur.next;
cur.next=pre;
pre=cur;
cur=next;
}
return pre;
}
}
方法二:递归
用递归也比较好理解
反转一个节点的链表(1->null)我们直接返回节点本身即可(1->null )
反转两个节点(1->2->null)的我们先将后面的节点保存为next(2->null),然后将next.next=head(2->1->2->1->......),head.next=null即可( 2->1->null)
反转三个节点(1->2->3->null),我们假设已经得到了反转好的后两个节点(1->3->2->null),只需要将头节点放在尾部即可,我们可以将后两个节点(3->2->null)当作一个整体来看,这样问题就变成了反转两个节点,所以我们可以使用递归的方法解决该问题。
class Solution {
public ListNode reverseList(ListNode head) {
if (head==null||head.next==null) return head;
ListNode next=head.next;
ListNode reverse=reverseList(next);
next.next=head;
head.next=null;
return reverse;
}
}