力扣初级算法-19-链表-反转链表

学习目标:

本次学习目标为 力扣初级算法-链表,其中主要的LC如下:

  • 反转链表

学习内容:

  1. 反转链表-----(链接
    给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

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

示例2:
输入:head = [1,2]
输出:[2,1]

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

解题思路:

  • 解法一: 使用栈解决

  • 边界问题:入参链表 head next 为空

  • 代码逻辑过程:

    • 将链表的所有链表节点 push 到栈中
    • 考虑边界问题: 入参链表 head next 为空
    • 对栈中的所有元素进行出栈,并递归下一个
    • 后一个结点就是反转前的头结点,一定要让他的next 等于空,否则会构成环
  • 代码实现:

// 解法一: 使用栈解决


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

	public ListNode reverseList01(ListNode head) {

		Stack<ListNode> stack = new Stack<>();

		// 将链表的所有链表节点 push 到栈中
		while (null != head) {
			stack.push(head);
			head = head.next;
		}

		// 边界问题:入参链表 head next 为空
		if (stack.isEmpty()) {
			return null;
		}

		ListNode node = stack.pop();
		ListNode reverse = node;
		// 对栈中的所有元素进行出栈,并递归下一个
		while (!stack.isEmpty()) {
			node.next = stack.pop();
			node = node.next;
		}

		//最后一个结点就是反转前的头结点,一定要让他的next
		//等于空,否则会构成环
		node.next = null;
		return reverse;
	}

解题思路:

  • 解法二:

  • 边界问题: 双链表解法

  • 代码逻辑过程:

    • 将当前节点作为最后返回链表 node 的下一个节点,倒置过来
    • 在返回的链表中,当前节点作为原链表中的next
    • 将当前的结果赋值到返回的链表中
    • 重新赋值,继续访问
  • 代码实现:


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

/***
	 * 解法二: 双链表解法
	 * 原理: 两链表的 next 反过来
 	 */
	public ListNode reverseList02(ListNode head) {
		ListNode node = null;

		while (null != head){
			ListNode tempNode = head.next;

			// 将当前节点作为最后返回链表 node 的下一个节点,倒置过来,
			// 在返回的链表中,当前节点作为原链表中的next
			head.next = node;
			// 将当前的结果赋值到返回的链表中
			node = head;
			// 重新赋值,继续访问
			head = tempNode;

		}
		return node;

	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值