每天一道算法题——链表反转

本文介绍了一种使用递归方法反转单链表的有效算法。通过递归地调整链表节点指针的方向,可以将链表从头到尾反转为从尾到头。文章还提供了详细的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是我第一次实习面试的时候被问到的算法题,现在想想当时还是很年轻啊。
链表是数据结构的基础而且变化多端,可以考察的点非常的多,单链表反转应该是在面试中出现次数比较多的一道题了,我觉得它是在考一个人的基础,也考察的思维灵敏度。
例如给定1 -> 2 -> 3 -> 4 -> 5,转换成5 -> 4 ->3 -> 2 -> 1。
比较巧妙的一种方法就是递归判断,假设已经递归到最后一步1 -> 2 <- 3 <- 4 <- 5,只要把节点2指向节点1就可以了有n 个节点,那么如果第一个节点后面的 n-1 个节点已经正确倒转了的话,我只要处理第一和第二个节点的指向关系就可以了。要是n-1个节点正确倒转,就先要n-2个节点倒转。。。这样递归下去直到只剩下最后一个节点,你可以看做它不是倒转也可以把它看做倒转。这就是递归的基线条件,而上面讲到的就是这个算法的递归条件,而且这样做也不用去考虑边界值问题。下面是代码实现:
节点结构:
package p_15_reverselist;

public class Node {
	int val;
	Node next;
}
构建链表:
package p_15_reverselist;

public class InitializeList {
	
	public Node createList(int nodeNum) {
		if(nodeNum <= 0) {
			return null;
		}
		
		Node head = null;
		int val = 0;
		Node node = null;
		
		while(nodeNum > 0) {
			if(head == null) {
				head = new Node();
				head.val = val;
				head.next = null;
				node = head;
			}else {
				node.next = new Node();
				node = node.next;
				node.val = val;
				node.next = null;
			}
			val++;
			nodeNum--;
		}
		return head;
	}
	
	public void printList(Node node){
		while(node != null) {
			System.out.print(node.val+"->");
			node = node.next;
		}
		System.out.println("null");
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		InitializeList init = new InitializeList();
		Node head = init.createList(6);
		init.printList(head);
		ReverseList rl = new ReverseList(head);
		init.printList(rl.getReverseList());
	}

}
反转列表:
package p_15_reverselist;

public class ReverseList {
	private Node head;
	private Node newHead;
	
	public ReverseList(Node head){
		this.head = head;
	}
	
	public Node reverse(Node node) {
		if(node == null || node.next == null) {
			newHead = node;
			return node;
		}
		
		Node head = reverse(node.next);
		head.next = node;
		node.next = null;
		
		return node;
	}
	
	public Node getReverseList(){
		reverse(head);
		return newHead;
	}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值