206. 反转链表
反转一个单链表。
示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
进阶: 你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
一、迭代方法:
分析:
第一步:创建ListNode型的变量cur,记录每次要交换的位置,初始cur = head.
第二步:再创建ListNode型的变量tmp,用来记录cur.next(因为下一步将会被删掉,而后面还会使用)。
第三步:将cur.next 修改为cur.next.next,这一步操作相当于删除了原始的cur.next。
第四步:将tmp放在head前面,head置为tmp。
将以上二、三、四步放在循环中,直到cur.next等于null时停止,这时链表就被反转完毕了,同时要注意在一开始时判断head是否为null。
代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
ListNode cur = head;
if(head != null){
while(cur.next != null){
ListNode tmp = cur.next;
cur.next = cur.next.next;
tmp.next = head;
head = tmp;
}
}
return head;
}
}
二、递归方法:
分析:
第一步:创建ListNode型的变量tmp,用来标记指向的位置,初始为null,因为反转完成后存1的位置的下一位是null。
第二步:判断head是否为null,为null直接返回head,不为null,创建ListNode型的变量next,存head.next。
第三步:将head.next修改为tmp.
第四步:判断next是否为null,如果不为空,将tmp更新为head,并将next作为参数传入reverseList(ListNode head)函数中进行递归。
代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
ListNode tmp = null;
public ListNode reverseList(ListNode head) {
if(head != null){
ListNode next = head.next;
head.next = tmp;
if(next != null){
tmp = head;
return reverseList(next);
}
}
return head;
}
}