反转链表,使用递归和非递归两种方法(关于递归执行的的顺序)

递归方法

先介绍一下简单的递归方法再到深入点的。

int age(int n)
{
int c;
if(n==1) c=10;
else c=age(n-1)+2;
return c;
}
main()
{
printf("age(5)=%d",age(5));
}
过程是:
age(5)=c=age(4)+2=18
age(4)=c=age(3)+2=16
age(3)=c=age(2)+2=14
age(2)=c=age(1)+2=12
age(1)=c=10
你输入的是printf("age(5)=%d",age(5))所以系统吧之前的age(4)age(2)保存起来,等到求出了某个值也就是age(1)时,再依次求age(2)age(5)这样
age(5)=18

在这里插入图片描述
在这里插入图片描述
这里是递归的方法。
原来的是5->4->3->2->1,反转后是1->2->3->4->5。

public class Main {
	static class ListNode{
		int val;
		ListNode next;
		ListNode(int x){
			val=x;
		}
	}
	static ListNode reverseList(ListNode head) {
		1 if(head==null||head.next==null)
			8 return head;
		2 System.out.print("hao");
		3 ListNode newHead=reverseList(head.next);//这里就是用来递归的调用。
		4 System.out.print("ren");
		5 head.next.next=head;
		6 head.next=null;
		7 return newHead;
}
	public static void main(String[] args) {
		ListNode head1 = new ListNode(0);
		ListNode node1 = new ListNode(1);
		ListNode node2 = new ListNode(2);
		ListNode node3 = new ListNode(3);
		head1.next=node1;
		node1.next=node2;
		node2.next=node3;
		node3.next=null;
		System.out.println(head1.next.next.next.val);
		9 System.out.println(reverseList(head1).next.next.next.val );
	}
}

在这里插入图片描述
说一下它的运行过程在当我们运行在标号为9的时候跳进reverseList方法,开始进入1,2,3这个时候又进入reverseList方法,开始1,2,3又进入开始1,2,3这个时候的又进入reverseList方法为1,8,3,4,5,6,7,接下来是3,4,5,6,7,再次是3,4,5,6,7最后跳出返回结果回到9接下来结束程序。
这个递归过程是先走出递归条件以上的代码句,在走递归条件以下的句子, 从上面的行走的过程可以看出在c和java上都一样。
前面的1,2,3一共走了三次为的是把刚创建的newHead指向最后一位,但此时整个链表的地址next指向是没有改变的还是5.next指向4,它的走到最后一个1,2,3是reverseList(head.next);此时的head是为2它的next为1,在判断if时候在next就为1的next也就为null了也就直接返回head此时1的头节点给newhead了,走到步奏8时返回的head是此时1的地址,在后来的 5,6步骤是让2.next则就是原来的1的next指向2,这样也就让原来的,指向方向颠倒了也就有了原来的链表倒置,依次循环也会把原来第一个的next指向为null。在经过34567的时候,列如:此时的3.next还是指向2的地址的,虽然前面的是把2.next置为null,当然原来的2.next是指向1的,因为要链表倒置3.next.next=head;也就是先把3到2的地址指向给交换一下,此时2.next指向3,3.next指向null但此时的4.next是指向3的,就这样依次循环会把原来首节点的next指向null。

非递归方法

ListNode newHead=null;
while(head!=null) {
	ListNode tmp=head.next;
	head.next=newHead;
	newHead=head;
	head=temp;
}

在这里插入图片描述
在这里插入图片描述
这也有点像两个数来进行的值进行交换,会找个中间值在保存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值