反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
我的思路:
这道题用递归解决。传入一个链表,我们先遍历到它的尾部。注意我们需要三个指针,一个指针head指向其头部,一个指针end指向其尾部,另一个指针last指向其尾部之前的那个节点。我们将尾部的节点连到head前面:先将尾部的节点的next连接到head上:end.next = head,再将last与尾部断开,last.next=null。最后,我们将剩余的从head开始的子链也进行反转(进入递归)。然后我们返回end。
递归终止的条件是当输入进来的链只有一个节点或链为空。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
if(head==null)
{
return null;
}
if(head.next==null)
return head;
ListNode p = head;
while(p.next.next!=null)
p=p.next;
ListNode last = p;
ListNode end = p.next;
end.next=last;
last.next=null;
reverseList(head);
return end;
}
}
递归解法2:
首先将head之后的子链反转。(递归)
然后将head接到反转后的子链尾部(这时子链尾部就是head.next):
head.next.next=head,再将head.next=null;
class Solution {
public ListNode reverseList(ListNode head) {
//递归终止条件是当前为空,或者下一个节点为空
if(head==null || head.next==null) {
return head;
}
//这里的cur就是最后一个节点
ListNode cur = reverseList(head.next);
//这里请配合动画演示理解
//如果链表是 1->2->3->4->5,那么此时的cur就是5
//而head是4,head的下一个是5,下下一个是空
//所以head.next.next 就是5->4
head.next.next = head;
//防止链表循环,需要将head.next设置为空
head.next = null;
//每层递归函数都返回cur,也就是最后一个节点
return cur;
}
}
本文介绍了一种使用递归方法来反转单链表的算法。通过两个递归思路详细解析了实现过程,包括如何利用尾节点进行反转以及如何将头节点连接到反转后的链表末尾。
4170

被折叠的 条评论
为什么被折叠?



