Reverse a singly linked list.
Hint:
代码二:
A linked list can be reversed either iteratively or recursively. Could you implement both?
分析:单链表翻转问题:迭代和递归两种做法
代码一:递归
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode reverseList(ListNode head) {
//iteratively
if(head == null || head.next == null) return head;
ListNode p = head;//定义p,q两个变量分别指向head和head.next
ListNode q = head.next;
p.next = null;//头结点变为尾结点,其next为null
ListNode n;//改变指针指向时临时存储数据的变量
while(q != null){
n = q.next;//先将结点q的next指向的结点用临时变量保存
q.next = p;//将q的next指向其之前的结点
p = q;//p,q分别向后移动一位,继续循环翻转,直到q为null
q = n;
}
return p;//返回翻转之后的头结点
}
}
代码二:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode reverseList(ListNode head) {
// recursively
if(head == null || head.next == null) return head;
ListNode p = head;
ListNode q = head.next;//定义两个变量分别指向链表的前两位
ListNode res = reverseList(q);
p.next = null;
q.next = p;
return res;
}
}