反转链表
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->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) {
//cur 保存当前的节点,prv为前一个的节点,temp保存下一个节点
ListNode cur=head;
ListNode prv=null;
ListNode temp=null;
// 每遍历一个节点,先保存当前节点的下一个节点,当前cur节点指向他的前一个节点prv
while(cur!=null)
{
temp = cur.next; // 先保存当前节点的下一个节点
cur.next = prv; // 当前cur节点指向他的前一个节点prv
prv = cur; // 前一个节点指向当前节点
cur = temp; // 当前节点指向下一个节点
}
return prv;
}
}
递归算法:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
// 递归基:递归到最后一个
if(head==null||head.next==null)
return head;
ListNode P = reverseList(head.next);// 返回一个的最后一个,作为最终的表头返回
head.next.next = head; // 当前的下一个节点的下一个节点 指向 当前节点
head.next = null; // 当前的下一个节点 指向 null
return P; // 一直返回尾节点
}
}