Leetcode __206. 反转链表

问题描述

反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

解题思路

迭代

  • 迭代是从前向后遍历的过程,所以要新new 一个链表,把原有链表从前向后取值,再一个一个挂到新链表上,每次都要先把新链表存到当前元素的下一个位置上,再将新链表的头指向当前元素,这样就起到一个换位的作用。

递归

  • List item

迭代实现

图示:https://blog.csdn.net/fx677588/article/details/72357389

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
 public ListNode reverseList(ListNode head) {
        if(head ==null){
            return null;
        }
        ListNode newList= null;
        ListNode cur = head;
        while (cur!=null){
            ListNode curNext = cur.next;
            cur.next=newList;//把原有链表的当前节点的next指向新链表已存在的部分
            newList=cur;//把新链表头部指向当前元素,这样就达到了倒叙的效果
            cur = curNext;
        }
        return newList;

    }
}

在这里插入图片描述

递归实现

class Solution {
    public ListNode reverseList(ListNode head) {
        if(head ==null || head.next == null){
            return head;
        }
        ListNode node = head.next;
        head.next = null;
        ListNode reverseRest = reverseList(node);
        node.next = head;
     return reverseRest;//返回的是第一次遍历结束后,第一出栈的5,随后出栈是不断给他的下一个元素赋值,不断的下一个,最终形成一个链表
    }

开始是从头开始遍历,1进栈,2进栈,3进栈,4进栈,5进栈,然后5没有next,5出栈(即最后的返回值),5出栈之后,到4的调用栈,这时node=5,head=4,把node.next = head,即5的下一个为4,然后4出栈,到3的调用栈,node=4,head=3,赋值,即4的下一个值为3,然后到2的调用栈,node = 3,head=2,赋值,即3的下一个值为2,2出栈,然后到1的调用栈,node=2,head=1,赋值,即2的下一个值为1,1出栈,最后第一次出栈的5就为5,4,3,2,1的链表

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Growing_way/article/details/83075718