关闭

Java单链表反转 详细过程

标签: Java单链表反转单链表翻转单链表反转单链表java
30550人阅读 评论(8) 收藏 举报
分类:

Java单链表反转 Java实现单链表翻转

    【尊重原创,转载请注明出处】http://blog.csdn.net/guyuealian/article/details/51119499
(一)单链表的结点结构: 
      data域:存储数据元素信息的域称为数据域; 
    next域:存储直接后继位置的域称为指针域,它是存放结点的直接后继的地址(位置)的指针域(链域)。
    data域+ next域:组成数据ai的存储映射,称为结点

    注意:①链表通过每个结点的链域将线性表的n个结点按其逻辑顺序链接在一起的。   
          ②每个结点只有一个链域的链表称为单链表(Single Linked List)。
     所谓的链表就好像火车车厢一样,从火车头开始,每一节车厢之后都连着后一节车厢。
     要实现单链表存储,首先是创建一结点类,其Java代码如下:
class Node {
	private int Data;// 数据域
	private Node Next;// 指针域
	public Node(int Data) {
		// super();
		this.Data = Data;
	}
	public int getData() {
		return Data;
	}
	public void setData(int Data) {
		this.Data = Data;
	}

	public Node getNext() {
		return Next;
	}
	public void setNext(Node Next) {
		this.Next = Next;
	}
}
(二)实现反转的方法:
  (1)递归反转法
:在反转当前节点之前先反转后续节点。这样从头结点开始,层层深入直到尾结点才开始反转指针域的指向。简单的说就是从尾结点开始,逆向反转各个结点的指针域指向,其过程图如下所示:
   head:是前一结点的指针域(PS:前一结点的指针域指向当前结点)
   head.getNext():是当前结点的指针域(PS:当前结点的指针域指向下一结点)
   reHead:是反转后新链表的头结点(即原来单链表的尾结点)

Java代码实现:
package javatest1;
public class javatest1 {
	public static void main(String[] args) {
		Node head = new Node(0);
		Node node1 = new Node(1);
		Node node2 = new Node(2);
		Node node3 = new Node(3);
		head.setNext(node1);
		node1.setNext(node2);
		node2.setNext(node3);

		// 打印反转前的链表
		Node h = head;
		while (null != h) {
			System.out.print(h.getData() + " ");
			h = h.getNext();
		}
		// 调用反转方法
		head = Reverse1(head);

		System.out.println("\n**************************");
		// 打印反转后的结果
		while (null != head) {
			System.out.print(head.getData() + " ");
			head = head.getNext();
		}
	}

	/**
	 * 递归,在反转当前节点之前先反转后续节点
	 */
	public static Node Reverse1(Node head) {
		// head看作是前一结点,head.getNext()是当前结点,reHead是反转后新链表的头结点
		if (head == null || head.getNext() == null) {
			return head;// 若为空链或者当前结点在尾结点,则直接还回
		}
		Node reHead = Reverse1(head.getNext());// 先反转后续节点head.getNext()
		head.getNext().setNext(head);// 将当前结点的指针域指向前一结点
		head.setNext(null);// 前一结点的指针域令为null;
		return reHead;// 反转后新链表的头结点
	}
}

	class Node {
		private int Data;// 数据域
		private Node Next;// 指针域

		public Node(int Data) {
			// super();
			this.Data = Data;
		}

		public int getData() {
			return Data;
		}

		public void setData(int Data) {
			this.Data = Data;
		}

		public Node getNext() {
			return Next;
		}

		public void setNext(Node Next) {
			this.Next = Next;
		}
	}

(2)遍历反转法:递归反转法是从后往前逆序反转指针域的指向,而遍历反转法是从前往后反转各个结点的指针域的指向。
   基本思路是:将当前节点cur的下一个节点 cur.getNext()缓存到temp后,然后更改当前节点指针指向上一结点pre。也就是说在反转当前结点指针指向前,先把当前结点的指针域用tmp临时保存,以便下一次使用,其过程可表示如下:
   pre:上一结点
   cur: 当前结点
   tmp: 临时结点,用于保存当前结点的指针域(即下一结点)



Java代码实现:
package javatest1;
public class JavaTest1 {
	public static void main(String[] args) {
		Node head = new Node(0);
		Node node1 = new Node(1);
		Node node2 = new Node(2);
		Node node3 = new Node(3);

		head.setNext(node1);
		node1.setNext(node2);
		node2.setNext(node3);

		// 打印反转前的链表
		Node h = head;
		while (null != h) {
			System.out.print(h.getData() + " ");
			h = h.getNext();
		}
		// 调用反转方法
		// head = reverse1(head);
		head = reverse2(head);

		System.out.println("\n**************************");
		// 打印反转后的结果
		while (null != head) {
			System.out.print(head.getData() + " ");
			head = head.getNext();
		}
	}

	/**
	 * 遍历,将当前节点的下一个节点缓存后更改当前节点指针
	 */
	public static Node reverse2(Node head) {
		if (head == null)
			return head;
		Node pre = head;// 上一结点
		Node cur = head.getNext();// 当前结点
		Node tmp;// 临时结点,用于保存当前结点的指针域(即下一结点)
		while (cur != null) {// 当前结点为null,说明位于尾结点
			tmp = cur.getNext();
			cur.setNext(pre);// 反转指针域的指向

			// 指针往下移动
			pre = cur;
			cur = tmp;
		}
		// 最后将原链表的头节点的指针域置为null,还回新链表的头结点,即原链表的尾结点
		head.setNext(null);
		
		return pre;
	}
}

class Node {
	private int Data;// 数据域
	private Node Next;// 指针域

	public Node(int Data) {
		// super();
		this.Data = Data;
	}

	public int getData() {
		return Data;
	}

	public void setData(int Data) {
		this.Data = Data;
	}

	public Node getNext() {
		return Next;
	}

	public void setNext(Node Next) {
		this.Next = Next;
	}
}

如果你觉得该帖子帮到你,还望贵人多多支持,鄙人会再接再厉,继续努力的~

19
2
查看评论

数据结构之Java单链表反转

本文为数据结构基础,研究得不是很深。用Java实现单链表的反转,虽然本文研究得不是很深,但是因为是数据结构,所以必须是在对Java内存比较清楚的情况下才能真正的搞懂吃透,如果对Java内存不够清楚,那最多只能学形而不能学其内在。       ...
  • qq_24692041
  • qq_24692041
  • 2017-03-16 15:44
  • 1440

链表常见操作java实现二:反转链表,从尾到头倒序遍历

1.反转链表反转链表在面试中非常常见。例如: 将原链表: 0->1->2->3 反转为新链表: 3->2->1->0 反转链表的一般思路是使用三个指针。其中,一个指针为当前节点,一个指针指向当前节点的下一个节点,另外一个节点则指向新链表表头从而保存结果。...
  • bitcarmanlee
  • bitcarmanlee
  • 2016-08-08 22:40
  • 5946

Java单链表反转 详细过程

Java单链表反转 Java实现单链表翻转 使用递归法实现单链表反转,使用遍历反转法:递归反转法是从后往前逆序反转指针域的指向,而遍历反转法是从前往后反转各个结点的指针域的指向。     【尊重原创,转载请注明出处】http://blog.csdn.net/guyuealian/...
  • guyuealian
  • guyuealian
  • 2016-04-11 10:36
  • 30550

使用递归和非递归方式反转单向链表

问题: 给一个单向链表,把它从头到尾反转过来。比如: a -> b -> c ->d 反过来就是 d -> c -> b -> a 。 分析: 假设每一个node的结构是: class Node { char value; Node next;...
  • beiyetengqing
  • beiyetengqing
  • 2012-05-24 00:18
  • 19295

Java实现反转链表

Java实现反转链表
  • lfeng1205
  • lfeng1205
  • 2016-08-09 17:18
  • 664

反转链表的Java实现

public class ReverseSingleList { /** * 递归,在反转当前节点之前先反转后续节点 * * @param head * @return */ public static Node reverse(Node head) {...
  • dong3560
  • dong3560
  • 2012-08-07 17:30
  • 11245

Java中单链表的实现和单链表的反转(倒置)

Java中单链表的实现和单链表的反转(倒置)
  • L_serein
  • L_serein
  • 2011-03-29 17:45
  • 9226

看图理解单链表的反转

如何把一个单链表进行反转? 方法1:将单链表储存为数组,然后按照数组的索引逆序进行反转。 方法2:使用3个指针遍历单链表,逐个链接点进行反转。 方法3:从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾。   方法1: 浪费空间。 ...
  • feliciafay
  • feliciafay
  • 2011-10-02 22:36
  • 49279

java实现链表反转

-Node.java -LinkList.java -Main.javaNode.java源码 public class Node{ public int data; public Node next; public Node(int data){ thi...
  • xia744510124
  • xia744510124
  • 2015-11-25 16:05
  • 3098

【数据结构】链表的原理及java实现

一:单向链表基本介绍链表是一种数据结构,和数组同级。比如,Java中我们使用的ArrayList,其实现原理是数组。而LinkedList的实现原理就是链表了。链表在进行循环遍历时效率不高,但是插入和删除时优势明显。下面对单向链表做一个介绍。单向链表是一种线性表,实际上是由节点(Node)组成的,一...
  • jianyuerensheng
  • jianyuerensheng
  • 2016-04-20 13:57
  • 29699
    个人资料
    • 访问:553511次
    • 积分:5888
    • 等级:
    • 排名:第5182名
    • 原创:106篇
    • 转载:51篇
    • 译文:1篇
    • 评论:174条
    博客专栏
    最新评论