反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
我的解法:
使用二分法递归 设置快慢指针找到中点 分别反转再连接
class Solution {
public ListNode Link(ListNode p,ListNode q)
{
ListNode temp=q;
while(temp.next!=null)
temp=temp.next;
temp.next=p;
return q;
}
public ListNode reverseList(ListNode head) {
if(head==null)
return null;
if(head.next==null)
return head;
if(head.next.next==null)
{
ListNode temp=head.next;
temp.next=head;
head.next=null;
head=temp;
return head;
}
else
{
ListNode slow=head;
ListNode fast=head.next;
while(fast!=null&&fast.next!=null)
{
slow=slow.next;
fast=fast.next.next;
}
ListNode temp=slow.next;
slow.next=null;
slow=reverseList(head);
fast=reverseList(temp);
return Link(slow,fast);
}
}
}
另一种递归解法 :
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;
return p;
}
假设只有两个节点更好理解