反转链表(力扣206)

1.题目描述

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

提示代码

/**
 * 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) {
       
    }
}

示例 1:
反转链表(力扣206)_第1张图片

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例 2:
反转链表(力扣206)_第2张图片
输入:head = [1,2]
输出:[2,1]

示例 3:
输入:head = []
输出:[]

思路分析

1.递归
使用递归的关键是要理解方法的作用。针对给的方法入手。利用方法来解决问题。给定一个链表:
1->2->3->4
已知它的头节点为1,那么反过来就是4->3->2->1
那么如果求出头节点的nest节点的反转,reverseList(ListNode head.next),即4->3->2再让第二个节点的next节点指向head节点就ok了。
此外当链表为空,或者链表中只有一个元素事,返回它本身,即head;

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;
    }
}

2.迭代
现在咱们能知道是单链表的头节点 head
要想反转链表,现在只能依靠head去获取元素,现在我们的想法就是将获取到的元素串起来;
比如说链表:
1->2->3->4
现在head指向的是元素第一个节点,
我们先建一个空的链表,用来存放反转后的链表,即Listnode newListnode=null;
现在我们将第一个节点取出:head;
head的next指向newhead
将NewHead指向Head节点即:newListnode=Head;在这之前我们需要建一个临时的链表;(应为如果head.next指向newListnode后后面的链接就断开了,所以要先建立临时的链表来存后面的链表:ListNode Tem=Head.next;,)
最后将Head指向Tem指向的节点:head=tem;
上如循环:当head指向Null时终止循环,即Head=null;

为了方便理解,可以将=看作指向,=前面的指向=后面的;

class Solution {
    public ListNode reverseList(ListNode head) {
       if(head==null||head.next==null){
           return head;
       }
        ListNode newListNode=null;
        while(head!=null){
        ListNode Tem=head.next;
        head.next=newListNode;
        newListNode=head;
        head=Tem; 
    }
     return newListNode;
    }
}

你可能感兴趣的:(算法练习,链表,leetcode,list)