剑指 Offer 24. 反转链表

题目:

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
**示例
输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL

方式一:

迭代法(头插法):
画图分析:设置一个前节点为null,再用临时变量保存当前节点的下一个节点,然后将当前节点的下一节点指向设置的前一节点,最后将前一节点后移,当前节点后移。


代码一:

  public static ListNode reverseList(ListNode head) {
    if(head==null||head.next==null){
        return head;
    }

    ListNode prev=null;//当前节点的前一节点
    ListNode curr=head;//当前节点
    while(curr!=null){
        ListNode temp=curr.next;//临时变量存当前节点的下一个节点
        curr.next=prev;//当前指针指向它前面的节点
        prev=curr;//指针后移
        curr=temp;//指针后移,处理下一个节点

    }
    return prev;
  }

方式二:

递归法:
先反转后面的链表,从最后两个节点开始反转,依次向前,将后一个节点指向前一个节点,再讲前一个节点指针域置为空,表示将原链表中前一个节点指向后一个节点的指向关系断开。

代码二:

  public ListNode reverseList(ListNode head) {
    //递归结束
    if(head==null||head.next==null){
        return head;
    }

    ListNode newNode=reverseList(head.next);

    head.next.next=head;
    head.next=null;//防止链表循环
    return newNode;
}

猜你喜欢

转载自www.cnblogs.com/ghlz/p/13396169.html