定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例
示例一
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
方法一 利用头插法反转链表
头插法的性质是链表顺序与插入顺序相反,正好符合题目要求
public ListNode reverseList(ListNode head) {
ListNode lRes = null;
//建立链表
while(head != null)
{
ListNode lTemp = new ListNode(head.val);
lTemp.next = lRes;
lRes = lTemp;
head = head.next;
}
return lRes;
}
方法二、递归
解析
递归首先要解决的问题是,当前半部分没有反转,而后半部分反转后,怎么反转新的节点
例如:
a->b->c->d->e......->x->y<-z
x节点之前的节点都没有进行反转,而y,z节点已经反转
我们希望y节点指向x节点,则有
x.next.next = x;
注意:首节点即a的next必须指向null,否则可能会形成环
class Solution {
public ListNode reverseList(ListNode head) {
//递归尾节点则返回本身
if(head == null || head.next == null)
{
return head;
}
ListNode newHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
}
}