Java 反转带头结点的单链表并显示输出的实现过程

注意:要保证已经有Node类和单链表的初始化,这样才能调用反转方法并显示结果。

方法如下:

//Node<T>指泛型结点类
public void reverse2(Node<T> head){
	Node<T> p=head.next;
	Node<T> q=head.next.next;
	head.next=null;
	p.next=null;
	while(q!=null){
		Node<T> temp=q.next;
		q.next=p;
		p=q;
		q=temp;
	}
	q=this.head;
	q.next=p;
    /*
    //想要直接在方法中遍历输出可以使用这段代码   ***p是反转后的第一个结点***
	for(Node<T> qq=p;qq!=null;qq=qq.next){//qq不能为q,因为结束循环后,p是最后一个结点,q是null
		System.out.print(qq.data+"\t");
	}
	*/

}

实现过程如图所示:

在循环之前,先把head以及初始p的next断掉,方便后面的循环;循环中的q.next=p就是重定向,这一步把原来的next指向p;

不用q=q.next来使q向后移动,因为q结点的指针重指向后,q的next为空了,无法正确指向下一个结点。这时用temp结点来做一下过渡,在q指针重指向之前,把q的下一个结点赋给temp,即temp=q.next,在重指向后,用q=temp来向后移动;

p=q;q=temp就是往后移动一个结点,可以继续重复循环。

循环结束时,q为空,p为最后一个结点,使q作为头结点并指向p就完成了反转。

整体代码:

Node类:

public class Node<T>{
	public T data;
	public Node<T>next;

	public Node(T data,Node<T>next){
		this.data=data;
		this.next=next;
	}

	public Node(){
		this(null,null);
	}

	public String toString(){
		return this.data.toString();
	}
}

单链表类:

public class SinglyList<T> {
public Node<T> head;
public SinglyList(){
	this.head=new Node<T>();
}
	public SinglyList(T[] values){
		this();
		Node<T> rear=this.head;
		for(int i=0;i<values.length;i++)
		{
			rear.next=new Node<T>(values[i],null);
			rear=rear.next;
		}
	}

//输出方法
public String toString(){
		String str=this.getClass().getName()+"(";
		for(Node<T>p=this.head.next;p!=null;p=p.next)
		{
			str+=p.data.toString();
			if(p.next!=null)
				str+=",";
		}
		return str+=")";
	}

//反转方法
public void reverse2(Node<T> head){
	Node<T> p=head.next;
	Node<T> q=head.next.next;
	head.next=null;
	p.next=null;
	while(q!=null){
		Node<T> temp=q.next;
		q.next=p;
		p=q;
		q=temp;
	}
	q=this.head;
	q.next=p;
    /*
    //想要直接在方法中遍历输出可以使用这段代码   ***p是反转后的第一个结点***
	for(Node<T> qq=p;qq!=null;qq=qq.next){//qq不能为q,因为结束循环后,p是最后一个结点,q是null
		System.out.print(qq.data+"\t");
	}
	*/
}

public static void main(String[] args) {
		Integer[] a={1,2,4,5,7};
SinglyList<Integer> sl=new SinglyList<>(a);
System.out.println(sl.toString());
sl.reverse2(sl.head);
System.out.println(sl.toString());
}
}

输出结果:

到此这篇关于Java 反转带头结点的单链表并显示输出的实现过程的文章就介绍到这了,更多相关Java带头结点的单链表内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java实现单链表反转的多种方法总结

    对于单链表不熟悉的可以看一下基于Java实现单链表的增删改查 一.原地反转 1.新建一个哨兵节点下一结点指向头结点 2.把待反转链表的下一节点插入到哨兵节点的下一节点 反转之前的链表:1–>2–>3–>4>–>5 加入哨兵节点:dummp–>1–>2–>3–>4>–>5 原地反转: 定义:prev=dummp.next; pcur=prev.next; prev.next=pcur.next; pcur.next=dummp.next; d

  • Java实现单链表SingleLinkedList增删改查及反转 逆序等

    节点类 可以根据需要,对节点属性进行修改.注意重写toString()方法,以便后续的输出操作. //节点类 class Node { public int id; public String name; public Node next; public Node(int id, String name) { this.id = id; this.name = name; } @Override public String toString() { return "Node{" + &

  • Java单链表反转图文教程

    前言 最近在回顾链表反转问题中,突然有一些新的发现和收获,特此整理一下,与大家分享

  • Java实现带头结点的单链表

    链表的特点 1,以节点方式存储,是链式结构. 2,每个节点包含data域,next域:指向下一个节点. 3,链表的各个节点不一定是连续存储. 4,链表分为带头节点和不带头节点两种类型的链表. 实现原理 添加节点:如下图所示,首先遍历原有链表,找到最后一个节点,将要增加的节点添加到该节点的后面.下面介绍如何找到最后一个节点. 思路是这样的,先遍历整个链表,定义一个辅助变量temp,用于暂时存储遍历出来的各个节点.首先将head头节点赋给temp(从头节点开始遍历),通过一个死循环不断的遍历节点的n

  • Java 反转带头结点的单链表并显示输出的实现过程

    注意:要保证已经有Node类和单链表的初始化,这样才能调用反转方法并显示结果. 方法如下: //Node<T>指泛型结点类 public void reverse2(Node<T> head){ Node<T> p=head.next; Node<T> q=head.next.next; head.next=null; p.next=null; while(q!=null){ Node<T> temp=q.next; q.next=p; p=q;

  • Java数据结构与算法之单链表深入理解

    目录 一.单链表(Linked List)简介 二.单链表的各种操作 1.单链表的创建和遍历 2.单链表的按顺序插入节点 以及节点的修改 3.单链表节点的删除 4.以上单链表操作的代码实现 (通过一个实例应用) 三.单链表常见面试题 1.求单链表中节点的个数 2.查找单链表中的倒数第K个节点[新浪面试题] 3.单链表的反转[腾讯面试题,有点难度] 4.从尾到头打印单链表 一.单链表(Linked List)简介 二.单链表的各种操作 1.单链表的创建和遍历 2.单链表的按顺序插入节点 以及节点的

  • Java 8实现任意参数的单链表

    本文实例为大家分享了Java 8实现任意参数的单链表,供大家参考,具体内容如下 1.实现功能 1)add():链表末尾添加元素: 2)pop():移除链表尾部元素: 3)insert():指定索引处添加元素: 4)delete():指定索引处删除元素: 5)getSize():获取链表当前长度: 6)display():展示链表当前元素. 2.代码 package DataStructure; /** * @author: Inki * @email: inki.yinji@qq.com * @

  • C++编程语言实现单链表详情

    目录 一.单链表简单介绍 二.下面我们先实现单链表的初始化. 三.实现单链表的插入与删除数据 一.单链表简单介绍 首先,我们再回顾一下线性表的两种存储方式--顺序存储与链式存储 上图左边为顺序存储,右边为链式存储 之前我们利用数组来实现顺序表,对于顺序表的优点缺点,总结来说就是,查找方便,增删复杂. 线性表之顺序存储的优缺点 而链表特点可以说恰恰相反,增删方便,查找复杂. 今天实现的是链表中最简单的一种--单链表(每个结点中只含有一个指针域) 对于链表我们只知道它每个结点的存储的物理地址是不连续

  • C++基于单链表实现学生成绩管理系统

    本文实例为大家分享了C++实现学生成绩管理系统的具体代码,供大家参考,具体内容如下 /*程序说明:     程序是由单链表实现的学生成绩管理系统,主要功能有输入/查找/删除/修改/排序/显示学生成绩;     输入功能由带头结点的单链表实现,并且使用前插法输入学生信息;     输入功能可以实现插入学生信息的功能,所以无需再专门写一个插入的函数;     删除/修改学生信息要用到查找功能,所以将查找与删除/修改功能写到一起;     查找功能使用顺序查找遍历整个单链表;     使用直接插入法对

  • C++数据结构之单链表的实现

    目录 一.单链表的定义 二.单链表的基本操作的实现 1.初始化 2.取值 3.查找 4.插入 5.删除 三.完整代码 四.测试一下代码 一.单链表的定义 线性表的链式存储又称为单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素.为了建立数据元素之间的线性关系,对每个链表结点,除存放元素自身的信息外,还需要存放一个指向其后继的指针. 单链表中结点类型的描述如下: typedef struct LNode{ // 定义单链表节点类型 ElemType data; // 数据域 struct

  • C++ 实现单链表创建、插入和删除

    目录 C++单链表创建.插入和删除 1.头节点插入和删除结果 2.中间节点插入和删除结果 3.尾结点插入和删除结果 C++单链表(带头结点) 总结归纳 代码实现 C++单链表创建.插入和删除 这里仅提供一种思路. #include <iostream> #include <stdio.h> #include <string> #include <conio.h> /** * cstdio是将stdio.h的内容用C++头文件的形式表示出来. *stdio.h

  • JAVA模拟新增顺序表及单链表

    最近在回顾大学学的数据结构,这里给大家用java模拟顺序表和单链表的新增 1顺序表新增 /** * 顺序表 * * @author cjd * */ public class ArrayList { private Object[] elementData; // 底层是一个数组,目前还没有确定长度 private int size; // 不是数组分配了几个空间,而是元素的个数 public ArrayList() { this(4); } public ArrayList(int initi

  • Java数据结构之单链表的实现与面试题汇总

    目录 1 单链表 1.1 单链表介绍 1.2 单链表的实现思路分析 1.3 实现代码 2 单链表的面试题 2.1 统计单链表中有效节点数量 2.2 新浪–倒数第k个节点 2.3 腾讯–单链表的反转 2.4 百度–逆序打印单链表 1 单链表 1.1 单链表介绍 由于顺序表的插入删除操作需要移动大量的元素,影响了运行效率,因此引入了线性表的链式存储——单链表.单链表通过一组任意的存储单元来存储线性表中的数据元素,不需要使用地址连续的存储单元,因此它 不要求在逻辑上相邻的两个元素在物理位置上也相邻.

随机推荐