Java实现单链表翻转

单链表翻转比如有如下链表:

需要按照C B A 输出,我们可以有好几种方法:

package org.andy.test;

import java.util.ArrayList;
import java.util.List;

/**
 * @author andy
 * @version:2015-2-4 上午9:41:12
 *
 *
 */

public class LinkedReverse {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		N n = new N();
		n.name = "A";

		N n1 = new N();
		n1.name = "B";

		N n2 = new N();
		n2.name = "C";

		N n3 = new N();
		n3.name = "D";

		n1.nextN = n2;
		n.nextN = n1;
		n2.nextN = n3;
		N old = n;
		while (old != null) {
			System.out.println(old.name);
			old = old.nextN;
		}

		System.out.println("链表翻转1");
		N new1 = reverseOne(n);
		while (new1 != null) {
			System.out.println(new1.name);
			new1 = new1.nextN;
		}

		/*
		System.out.println("链表翻转2");
		N new2 = reverseTwo(n, null);
		while (new2 != null) {
			System.out.println(new2.name);
			new2 = new2.nextN;
		}

		System.out.println("链表翻转3");
		N new3 = reverseThree(n);
		while (new3 != null) {
			System.out.println(new3.name);
			new3 = new3.nextN;
		}

		*/
	}

	//采用交换前后值
	public static N reverseOne(N n) {
		if (n != null) {
			N preN = n; //前一个节点
			N curN = n.nextN; //当前节点
			N nextN ;   //后一个节点
			while (null != curN) {
				nextN = curN.nextN;
				curN.nextN = preN;
				preN = curN;
				curN = nextN;
			}

			n.nextN = null;
			n = preN;

			return n;

		}
		return null;
	}

	//采用递归实现
	public static N reverseTwo(N n, N newN) {
		// 采用递归 返回 返回条件是最后一个几点nextN为空
		if (n == null) {
			return newN;
		}

		N nextN = n.nextN;
		n.nextN = newN;
		return reverseTwo(nextN, n);
	}

	//最烂的实现方式
	public static N reverseThree(N n) {
		if (n == null) {
			return null;
		}
		// 定义一个集合 ,放在集合里面在单个反向指回
		List<N> nList = new ArrayList<N>();
		N p = n;
		while (p != null) {
			N node = new N();// 当前节点
			node.name = p.name;
			nList.add(node);
			p = p.nextN;
		}

		// 在返现输出节点
		n = null;
		for (N rn : nList) {
			if (n != null) {
				// 如果n不为空时
				rn.nextN = n;
			}
			n = rn;
		}

		return n;
	}

}

// 定义一个节点
class N {
	public String name;
	public N nextN;
}
时间: 2024-10-06 23:34:29

Java实现单链表翻转的相关文章

20140428 宏定义 单链表翻转 野指针

1.宏定义swap,加括号有什么意义 #define swap(x,y) x = (x)+(y):y=(x)-(y):x=(x)-(y) 加括号是为了处理表达式参数(即宏的参数可能是个算法表达式)时不出错,因为宏替换就是文本替换,所以如果有以下情况: #define COM(A,B) (A)*(B) 那么COM(6+5,3),它会换成这样: (6+5)*(3) 但是如是去掉了定义中括号,即写成这样: #define COM(A,B) A*B 那么COM(6+5,3),它就会换成这样:6+5*3

将单链表翻转的两种方法

将一个单链表翻转的描述很简单,例如: 输入: NODE1->NODE2->NODE3->NODE4->NODE5->NULL 输出: NODE5->NODE4->NODE3->NODE2->NODE1->NULL 那么,定义单链表如下: (为简单起见,将data字段定义为int, 当然实际应用中data很可能是一个复杂的结构体) typedef struct list_s { int data; struct list_s *next; } li

java实现单链表

前面已经介绍了java如何实现顺序链表:http://www.cnblogs.com/lixiaolun/p/4643664.html 接下来,我们开始学习java实现单链表. 单链表类 package linklist; public class LinkList { class Element { public Object value=null; private Element next=null; } private Element header = null;//头结点 /** * 初

java 实现单链表的逆序

</pre><pre name="code" class="java">package com.ckw.mianshi; /** * java 实现单链表的逆序 * @author Administrator * */ public class SingleLinkedReverse { class Node{ int data; Node next; public Node(int data){ this.data = data; } }

JAVA 实现单链表

1 public class LinkNode { 2 public String data; 3 public LinkNode next; 4 5 LinkNode(){ 6 this.data = "a"; 7 this.next = null; 8 } 9 10 LinkNode(String string){ 11 this.data = string; 12 this.next = null; 13 } 14 } 1 public class LinkList { 2 3

Java 实现单链表反序

//单链表反序 public class SingleLinkedListReverse { public static void main(String[] args) { Node head = new Node(0); Node temp = null; Node cur = null; for (int i = 1; i <= 10; i++) { temp = new Node(i); if (i == 1) { head.setNext(temp); } else { cur.set

数据结构复习--java实现单链表基本操作

单链表的基本操作包括建立单链表.查找运算(按序查找和按值查找).插入运算(前插和后插)和删除运算.下面给出具体的java实现程序: package com.zpp.test; //首先创建一个节点类 public class Node { private Node next; //指针域 private int data;//数据域 public Node( int data) { this. data = data; } } package com.zpp.test; public class

用java实现单链表

对于一个单链表来说,要求有最基本的数据节点以及一些重要的方法. 方法应该有增删改查.定位.输出.获取链表长度.排序.链表读入.链表输出.下面是我用java写的单链表 public class List { public class Node{//定义节点 public int data; public Node next; public Node(int data){ this.data = data; } } private Node head;//头节点 public Node getHea

用Java实现单链表的基本操作

笔试题中经常遇到单链表的考题,下面用java总结一下单链表的基本操作,包括添加删除节点,以及链表转置. package mars; //单链表添加,删除节点 public class ListNode { private Node head; public ListNode(){ head=null; } //在链表前添加节点 public void addpre(int dvalue){ Node n=new Node(dvalue); if(head==null){ head=n; }els