剑指-反转链表-栈+递归

题目描述

输入一个链表,反转链表后,输出新链表的表头。

思路

一、栈。
把链表节点一个个入栈,当全部入栈完之后再一个个出栈,出栈的时候在把出栈的结点串成一个新的链表。

二、递归。
终止条件是当前节点或者下一个节点==null
在函数内部,改变节点的指向,也就是 head 的下一个节点指向 head 递归函数。

代码

一、栈

public ListNode reverseList(ListNode head) {
    
    
    Stack<ListNode> stack = new Stack<>();
    //把链表节点全部摘掉放到栈中
    while (head != null) {
    
    
        stack.push(head);
        head = head.next;
    }
    if (stack.isEmpty())
        return null;
    ListNode node = stack.pop();
    ListNode dummy = node; // 保存头结点***
    //栈中的结点全部出栈,然后重新连成一个新的链表
    while (!stack.isEmpty()) {
    
    
        ListNode tempNode = stack.pop();
        node.next = tempNode;
        node = node.next;
    }
    //最后一个结点就是反转前的头结点,一定要让他的next
    //等于空,否则会构成环***
    node.next = null;
    return dummy;
}

二、递归。

class Solution {
    
    
	public ListNode reverseList(ListNode head) {
    
    
		//递归终止条件是当前为空,或者下一个节点为空
		if(head==null || head.next==null) {
    
    
			return head;
		}
		//这里的cur就是最后一个节点
		ListNode cur = reverseList(head.next);
		//如果链表是 1->2->3->4->5,那么此时的cur就是5
		//而head是4,head的下一个是5,下下一个是空
		//所以head.next.next 就是5->4
		head.next.next = head;
		//防止链表循环,需要将head.next设置为空
		head.next = null;
		//每层递归函数都返回cur,也就是最后一个节点
		return cur;
	}
}

栈好理解。
递归理解不了就背。

猜你喜欢

转载自blog.csdn.net/qq_32301683/article/details/108462773