反转链表Java

题目:定义一个链表,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。

思路:反转链表时,为了保证链表不断开,需要保存三个引用,指向前一结点的引用,当前结点的引用,指向后一结点的引用。

//反转链表
	public static ListNode reverseList(ListNode head){
		if(head==null)return null;
		ListNode reverseHead = null;
		ListNode node = head;
		ListNode prev = null;
		while(node!=null){
			ListNode pNext = node.next;
			if(pNext==null)
				reverseHead = node;
			node.next = prev;
			prev = node;
			node = pNext;
		}
		return reverseHead;
	}


递归写法:

	/*
	 * 递归实现反转链表
	 */
	public static ListNode reverseListRecursive(ListNode head){
		if(head == null || head.next==null) return head;
		ListNode newHead = reverseListRecursive(head.next);
		//递归返回后继续执行下面的代码
		/*
		 * 假设链表是p0,p1,p2,p3
		 * 从最后一层返回时newHead=p3;
		 * 返回到倒数第二次递归:newHead=p3,head=p2,
		 * head.next=p3,p3.next=p2;p2.next=null;
		 * 返回到倒数第三次递归:newHead=p3,head=p1,
		 * head.next=p2,p2.next=p1,p1.next=null;
		 * 返回到最上面一层:newHead=p3,head=p0,
		 * head.next=p1,p1.next=p0,p0.next=null
		 */
		head.next.next = head;
		head.next = null;
		return newHead;
	}
	
	/**
	 * 递归二
	 * @param current
	 * @return
	 */
	public static ListNode reverse(ListNode current)
	 {
	     if (current == null || current.next == null) return current;
	     ListNode nextNode = current.next;
	     current.next = null;
	     ListNode reverseRest = reverse(nextNode);
	     nextNode.next = current;
	     return reverseRest;
	 }

递归返回后继续执行下面的代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值