zoukankan      html  css  js  c++  java
  • Java反转单链表(code)

    主要是面试中可能会经常碰上该类似操作,尤其是稍大点公司,面试官可能并不在乎你能不能搞定该题,但是这类型题目最是能体现程序员的思维状态 ---一个迷糊头脑的程序员 怎能立志改变这个世界

    /**
     * @author luochengcheng
     * 定义一个单链表
     */
    class Node {
    	//变量
    	private int record;
    	//指向下一个对象
    	private Node nextNode;
    
    	public Node(int record) {
    		super();
    		this.record = record;
    	}
    	public int getRecord() {
    		return record;
    	}
    	public void setRecord(int record) {
    		this.record = record;
    	}
    	public Node getNextNode() {
    		return nextNode;
    	}
    	public void setNextNode(Node nextNode) {
    		this.nextNode = nextNode;
    	}
    }
    
    /**
     * @author luochengcheng
     *	两种方式实现单链表的反转(递归、普通)
     *	新手强烈建议旁边拿着纸和笔跟着代码画图(便于理解)
     */
    public class ReverseSingleList {
    	/** 
    	 * 递归,在反转当前节点之前先反转后续节点 
    	 */
    	public static Node reverse(Node head) {
    		if (null == head || null == head.getNextNode()) {
    			return head;
    		}
    		Node reversedHead = reverse(head.getNextNode());
    		head.getNextNode().setNextNode(head);
    		head.setNextNode(null);
    		return reversedHead;
    	}
    
    	/** 
    	 * 遍历,将当前节点的下一个节点缓存后更改当前节点指针 
    	 *  
    	 */
    	public static Node reverse2(Node head) {
    		if (null == head) {
    			return head;
    		}
    		Node pre = head;
    		Node cur = head.getNextNode();
    		Node next;
    		while (null != cur) {
    			next = cur.getNextNode();
    			cur.setNextNode(pre);
    			pre = cur;
    			cur = next;
    		}
    		//将原链表的头节点的下一个节点置为null,再将反转后的头节点赋给head   
    		head.setNextNode(null);
    		head = pre;
    		
    		return head;
    	}
    
    	public static void main(String[] args) {
    		Node head = new Node(0);
    		Node tmp = null;
    		Node cur = null;
    		// 构造一个长度为10的链表,保存头节点对象head   
    		for (int i = 1; i < 10; i++) {
    			tmp = new Node(i);
    			if (1 == i) {
    				head.setNextNode(tmp);
    			} else {
    				cur.setNextNode(tmp);
    			}
    			cur = tmp;
    		}
    		//打印反转前的链表
    		Node h = head;
    		while (null != h) {
    			System.out.print(h.getRecord() + " ");
    			h = h.getNextNode();
    		}
    		//调用反转方法
    		head = reverse2(head);
    		System.out.println("
    **************************");
    		//打印反转后的结果
    		while (null != head) {
    			System.out.print(head.getRecord() + " ");
    			head = head.getNextNode();
    		}
    	}
    }
    天生我才必有用,千金散去还复来!
  • 相关阅读:
    英语四级day1
    Hadoop实战
    Red Hat
    SQL Cookbook
    Java改错学习法
    Java程序设计经典300例
    Git
    ColorOS和MIUI双系统安装笔记
    深入浅出MySQL数据库开发、优化于管理维护
    剑指Offer名企面试官精讲典型编程题
  • 原文地址:https://www.cnblogs.com/Jack-Lu/p/4350872.html
Copyright © 2011-2022 走看看