zoukankan      html  css  js  c++  java
  • 《剑指offer》面试题16 反转链表 Java版

    (输入链表的头节点,反转链表)

    书中方法:对于一个链表,我们只能从头往后遍历,如果要反转,我们需要更改当前节点的next域指向前一个节点,此时链表断开,为了能继续修改下一个节点的next域,我们还要维护下一个节点。

    	public ListNode reverse(ListNode first){
    		if(first == null)return first;
    		ListNode last = null;
    		ListNode now = first;
    		ListNode next = first.next;
    		while(now != null){
    			now.next = last;
    			
    			last = now; 
    			now = next;
    			if(now != null){
    				next = now.next;
    			}
    		}
    		return last;
    	}
    

    方法二:书后面还提到了递归的方法。自己写的逻辑比较不清楚,在网上找了一个版本。这个方法的思路是:递归返回的是当前节点右侧已经反转好的链表的头节点,对于当前的节点,将它连接到已经reverse好的链表的末尾,返回值是添加了该节点的新链表头。先递归后处理,最后的返回值是反转后的节点,每次递归返回的是添加了当前节点的反转后的链表。注意递归出口的处理。

    	public ListNode reverse2(ListNode first){
    		if(first == null || first.next == null)return first;
    		
    		ListNode newHead = reverse2(first.next);
    		first.next.next = first;
    		first.next = null;
    		
    		return newHead;
    		
    	}
    
  • 相关阅读:
    Linux/windows查看设置环境变量指令
    转载:windows查看进程相关指令
    Ubuntu开启SSHD服务
    Ubuntu root方式登录
    洛谷P1466 集合 Subset Sums
    洛谷P1726 上白泽慧音
    洛谷P1983 车站分级
    洛谷P2577 [ZJOI2005]午餐
    洛谷P1119 灾后重建
    P1169 [ZJOI2007]棋盘制作
  • 原文地址:https://www.cnblogs.com/czjk/p/11611783.html
Copyright © 2011-2022 走看看