反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
思路
需要三个存放的位置 上一个 当前元素,下一个元素
package com.binglian.Linked;
/**
* 206时间复杂度:O(n)
* 空间复杂度:O(1)
* @author binglian
*
*/
public class LK_206 {
public class ListNode{
int val;
ListNode next;
ListNode(int x){
val=x;
}
}
public ListNode reverseList(ListNode head) {
ListNode pre=null;
ListNode cur=head;
while(cur !=null){
ListNode next=cur.next;
cur.next=pre;
pre=cur;
cur=next;
}
return pre;
}
}
使用递归的方法
package com.binglian.Linked;
import javax.management.BadAttributeValueExpException;
/**
* 递归的方式反转
* 时间复杂度:O(n)
* 空间复杂度:O(n) 注意,递归是占用空间的,占用空间的大小和递归深度成正比
* @author binglian
*
*/
public class LK_206_2 {
public class ListNode{
int val;
ListNode next;
ListNode(int x){
val=x;
}
}
public ListNode reverseList(ListNode head) {
//递归终止条件
if(head==null || head.next==null)
return head;
ListNode rhead=reverseList(head.next);
//head->next此刻指向head后面的链表的尾节点
//head->next->next=head把head节点放在了尾部
head.next.next=head;
head.next=null;
return rhead;
}
}