题目描述
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
思想
迭代法
定义两个指针prev、curr,prev指向前一个节点,curr指向当前节点。遍历当前链表,首先在指向反转时取出下一个节点并保留到next,防止链表丢失。然后将当前节点指向上一个节点(curr.next=prev)。反转完成后将prev、curr后移。
递归
- 使用递归函数,一直递归到链表的最后一个结点,该结点就是反转后的头结点,记作 retret .
- 此后,每次函数在返回的过程中,让当前结点的下一个结点的 nextnext 指针指向当前节点。
- 同时让当前结点的 next.next 指针指向 NULL ,从而实现从链表尾部开始的局部反转
- 当递归函数全部出栈后,链表反转完成。
代码实现
迭代
class Solution {
public ListNode reverseList(ListNode head) {
ListNode prev=null;
ListNode curr=head;
while(curr!=null){
//先取出下一个节点,防止链表丢失
ListNode next=curr.next;
//指向上一个节点
curr.next=prev;
//往前移动指针
prev=curr;
curr=next;
}
return prev;
}
}
递归
class Solution {
public ListNode reverseList(ListNode head) {
if(head==null || head.next==null){
return head;
}
//递归找到原链表的尾节点当成头节点
ListNode ret=reverseList(head.next);
//将当前节点的下一个节点指向当前节点
head.next.next=head;
head.next=null;
return ret;
}
}