leetcode之反转链表图文详解
Posted icdat
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode之反转链表图文详解相关的知识,希望对你有一定的参考价值。
206-反转链表
题目:
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
思路:
迭代法:
新建一个链表的头部,循环遍历旧链表的结点,将其加到新链表的后面
递归法
代码:(迭代法)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
ListNode new=null;//新建一个结点,依此来作为新表的尾结点
ListNode p = head;//新建一个结点p,指向head的第一个结点
while(!head){
ListNode tmp = p.next;//tmp用来暂时存放p.next
p.next=new;/*将p(旧链表的的第一个结点)指向新结点,即p成为了新链表的第一个结点;同时注意这里将p.next的值改变,所以需要上一步暂时存放剩下旧链表的第一个结点*/
new=p;/*将新链表的头指针始终指向新链表的第一个结点*/
p=tmp;/*将剩下的旧链表的第一个结点赋值给p*/
}
return new;
}
}
(递归法):
/**
* 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 || head.next==null){/*递归的终止条件,返回的尾结点*/
return head;
}
else{
ListNode p = head.next;//a
ListNode rehead = reverseList(p);//b
p.next = head;//c
head.next=null;//d
return rehead;
}
}
}
递归法详解:(参考上代码)
次数 head p 0 1 2 1 2 3 2 3 4 3 4 5 4 5 null 上图表示的是递归次数对应的head,p值
- 首先进if判断,不符合然后进else,执行到a处时,即表上次数为0时图示为:
- 然后递归,在最后一层递归的时候,进终止递归判断的时候,即次数为4图示为:
然后返回head
- 返回后次数为3,p为返回的head=5 此时的图示为:
详解次数为3的情况:
- 执行b完时图示为:
继续执行,执行完c时的图示为:
继续执行,执行完d时的图示为:
然后返回rehead
返回后的次数为2,即head为3,p为4,执行完b后的图示:
依次执行c、d等操作,等次数为0执行完d时就完成了链表的反转了:
这么看来rehead即为反转后的链表的第一个结点,至此反转结束。
以上是关于leetcode之反转链表图文详解的主要内容,如果未能解决你的问题,请参考以下文章