算法题009 -- [反转单链表] by java

题目

反转单链表,可以使用迭代或者递归的方法

思路

具象化反转单链:

反转前:

在这里插入图片描述

反转中:

在这里插入图片描述

反转后:

在这里插入图片描述

(PS:上述图片搬运自 链表面试题(一):反转链表的算法实现

  • 用文字来描述上图的步骤:
    1. 将V节点的next,指向上一个节点U
    2. 在步骤1完成前,需要有一个局部变量值记录住W节点,否则W节点就会遗失
    3. 最后指针指向W节点,继续下一个节点的处理
以上就是每一个节点都需要做的事情了,不管是迭代的方法还是递归的方法都是这样的步骤。 然而需要考虑的还不止这么多,比如第一个节点的上一个节点的处理,以及方法结束时的返回值的处理。

代码

package algorithm9;

import algorithm6.ListNode;

public class Algorithm9 {

	public static void main(String[] args) {
		ListNode test = getListNode1();
		System.out.println(test.toString());
		test = reverseListNode2(test, null);
		System.out.println(test.toString());
	}
	
	/**方法一:迭代
	 * 注意点:tempNext == null 时,说明已经迭代到最后一个节点了,这时为headNode赋值
	 * @param listNode
	 * @return
	 */
	public static ListNode reverseListNode(ListNode listNode) {
		ListNode pre = null;
		ListNode headNode = null;
		while(listNode != null) {
			ListNode tempNext = listNode.next;
			listNode.next = pre;
			pre = listNode;
			if(tempNext == null) 
				headNode = listNode;
			listNode = tempNext;
		}
		return headNode;
	}
	
	/**方法二:递归
	 * 注意点:listNode.next == null 时,说明已经迭代到最后一个节点了
	 * 		 与迭代方法不同的是,这里没有固定局部变量来记录头结点,所以就需要将整个链表串成一个完整的链表
	 * @param listNode
	 * @param pre
	 * @return
	 */
	public static ListNode reverseListNode2(ListNode listNode, ListNode pre) {
		if(listNode.next == null) {
			listNode.next = pre;
			return listNode;
		}
		ListNode tempNext = listNode.next;
		listNode.next = pre;
		pre = listNode;
		listNode = tempNext;
		return reverseListNode2(listNode, pre);
	}
	
	public static ListNode getListNode1() {
		ListNode listNode2 = new ListNode(0);
		ListNode listNode4 = new ListNode(1);
		ListNode listNode6 = new ListNode(2);
		ListNode listNode8 = new ListNode(3);
		ListNode listNode10 = new ListNode(4);
		ListNode listNode11 = new ListNode(5);
		ListNode listNode12 = new ListNode(5);
		ListNode listNode13 = new ListNode(4);
		listNode2.next = listNode4;
		listNode4.next = listNode6;
		listNode6.next = listNode8;
		listNode8.next = listNode10;
		listNode10.next = listNode11;
		listNode11.next = listNode12;
		listNode12.next = listNode13;
		return listNode2;
	}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值