链表的构造,获取,删除,顺序输出,倒序输出,反转
2018-01-08 15:43
375 查看
线性表的数据结构图:
链表简介:
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列节点组成,这些节点不必在内存中相连。每个节点由数据部分Data和链部分Next,Next指向下一个节点,这样当添加或者删除时,只需要改变相关节点的Next的指向,效率很高。
链表的实现还有其它的方式,常见的有循环单链表,双向链表,循环双向链表。 循环单链表 主要是链表的最后一个节点指向第一个节点,整体构成一个链环。 双向链表 主要是节点中包含两个指针部分,一个指向前驱元,一个指向后继元,JDK中LinkedList集合类的实现就是双向链表。** 循环双向链表** 是最后一个节点指向第一个节点。
操作的源码如下:
package com.wpao.data;
public class NodeTest {
/**
* @param args
*/
public static void main(String[] args) {
NodeTest nodetest = new NodeTest ();
Node<Students> head = null;
Node<Students> tail = null;
System.out.println("原链表:");
head = nodetest.constructNode(head);
Node<Students> remove = nodetest.remove(head,0);
nodetest.eachNode(remove);
Node<Students> get = nodetest.get(head, 0);
System.out.println("******"+((get!=null) ? get.item.toString():"不存在"));
/*
System.out.println("反转后:");
head = nodetest.fanzhuanNode(head);
nodetest.eachNode(head);
System.out.println("倒序便利:");
nodetest.reverseNode(head);
System.out.println("顺序便利:");
nodetest.eachNode(head);
*/
}
/**
* 删除特定元素:
* @param head
* @param i
* @return
*/
public Node<Students> remove(Node<Students> head,int i){
Node<Students> curr = null;
Node<Students> previous = null;
if(i<1){
System.out.println(" 该元素不存在,当前下标:"+i+",设定第一个元素为1.");
}
curr = head;
int j = 1;
while(curr != null){
if(i==j){
if(previous==null){
return null;
}
previous.next = curr.next;
return head;
}
previous = curr;
curr = curr.next;
j+=1;
}
return head;
}
/**
* 获取特定元素:
* @param head
* @param i
* @return
*/
public Node<Students> get(Node<Students> head,int i){
Node<Students> curr = null;
if(i<1){
System.out.printl
4000
n(" 该元素不存在,当前下标:"+i+",设定第一个元素为1.");
}
curr = head;
int j = 1;
while(curr != null){
if(i==j){
return curr;
}
curr = curr.next;
j+=1;
}
return null;
}
/**
* 将链表的顺序进行反转:逐一改变相邻两节点之间的关系,返回之前的尾节点处理;
* 注意点:对象的引用是同一个内存区域,一个引用修改,另一个引用也发生修改;
* @param head
* @return
*/
public Node<Students> fanzhuanNode (Node<Students> head){
Node<Students> curr = head;//i节点;
Node<Students> next = null;//i+1点;
Node<Students> previous = null;//i-1点;
while(curr != null){
next = curr.next;
if (next ==null){
curr.next = previous;
return curr;
}
curr.next = previous;
previous = curr;
curr = next;
}
return null;
}
/**
* 倒序便利:采用递归的思想,逐步取出最后一个元素,后输出;
* @param head
*/
public void reverseNode (Node<Students> head){
if(head!=null){
reverseNode(head.next);
System.out.println(" "+head.item);
}
}
/**
* 顺序便利:输出当前元素,然后将当前元素的指向为下一个元素;
* @param head 头节点:
*/
public void eachNode(Node<Students> head){
if(head==null){
System.out.println(" 链表为空!");
}
Node<Students> curr = head;
while(curr != null){
System.out.println(" "+curr.item);
curr = curr.next;
}
}
/**
* 构造链表:
* @param head 头节点;
* @param tail 尾节点;
*/
public Node<Students> constructNode(Node<Students> head){
//构造第一个节点:
head = new Node(new Students(1,"first1"));
Node<Students> tail = head;
//构造第二个节点:
tail.next = new Node(new Students(2,"first2"));
tail = tail.next;
for(int i=3;i<10;i++){
tail.next = new Node(new Students(i,"first"+i));
tail = tail.next;
}
return head;
}
}
/**
* 节点声明:
* @author dada
*
* @param <E>
*/
class Node<E> {
E item;
Node<E> next;
//构造函数
Node(E element) {
this.item = element;
this.next = null;
}
}
class Students {
private int id;
private String name;
public Students(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return " "+"Students [id=" + id + ", name=" + name + "]";
}
}
链表简介:
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列节点组成,这些节点不必在内存中相连。每个节点由数据部分Data和链部分Next,Next指向下一个节点,这样当添加或者删除时,只需要改变相关节点的Next的指向,效率很高。
链表的实现还有其它的方式,常见的有循环单链表,双向链表,循环双向链表。 循环单链表 主要是链表的最后一个节点指向第一个节点,整体构成一个链环。 双向链表 主要是节点中包含两个指针部分,一个指向前驱元,一个指向后继元,JDK中LinkedList集合类的实现就是双向链表。** 循环双向链表** 是最后一个节点指向第一个节点。
操作的源码如下:
package com.wpao.data;
public class NodeTest {
/**
* @param args
*/
public static void main(String[] args) {
NodeTest nodetest = new NodeTest ();
Node<Students> head = null;
Node<Students> tail = null;
System.out.println("原链表:");
head = nodetest.constructNode(head);
Node<Students> remove = nodetest.remove(head,0);
nodetest.eachNode(remove);
Node<Students> get = nodetest.get(head, 0);
System.out.println("******"+((get!=null) ? get.item.toString():"不存在"));
/*
System.out.println("反转后:");
head = nodetest.fanzhuanNode(head);
nodetest.eachNode(head);
System.out.println("倒序便利:");
nodetest.reverseNode(head);
System.out.println("顺序便利:");
nodetest.eachNode(head);
*/
}
/**
* 删除特定元素:
* @param head
* @param i
* @return
*/
public Node<Students> remove(Node<Students> head,int i){
Node<Students> curr = null;
Node<Students> previous = null;
if(i<1){
System.out.println(" 该元素不存在,当前下标:"+i+",设定第一个元素为1.");
}
curr = head;
int j = 1;
while(curr != null){
if(i==j){
if(previous==null){
return null;
}
previous.next = curr.next;
return head;
}
previous = curr;
curr = curr.next;
j+=1;
}
return head;
}
/**
* 获取特定元素:
* @param head
* @param i
* @return
*/
public Node<Students> get(Node<Students> head,int i){
Node<Students> curr = null;
if(i<1){
System.out.printl
4000
n(" 该元素不存在,当前下标:"+i+",设定第一个元素为1.");
}
curr = head;
int j = 1;
while(curr != null){
if(i==j){
return curr;
}
curr = curr.next;
j+=1;
}
return null;
}
/**
* 将链表的顺序进行反转:逐一改变相邻两节点之间的关系,返回之前的尾节点处理;
* 注意点:对象的引用是同一个内存区域,一个引用修改,另一个引用也发生修改;
* @param head
* @return
*/
public Node<Students> fanzhuanNode (Node<Students> head){
Node<Students> curr = head;//i节点;
Node<Students> next = null;//i+1点;
Node<Students> previous = null;//i-1点;
while(curr != null){
next = curr.next;
if (next ==null){
curr.next = previous;
return curr;
}
curr.next = previous;
previous = curr;
curr = next;
}
return null;
}
/**
* 倒序便利:采用递归的思想,逐步取出最后一个元素,后输出;
* @param head
*/
public void reverseNode (Node<Students> head){
if(head!=null){
reverseNode(head.next);
System.out.println(" "+head.item);
}
}
/**
* 顺序便利:输出当前元素,然后将当前元素的指向为下一个元素;
* @param head 头节点:
*/
public void eachNode(Node<Students> head){
if(head==null){
System.out.println(" 链表为空!");
}
Node<Students> curr = head;
while(curr != null){
System.out.println(" "+curr.item);
curr = curr.next;
}
}
/**
* 构造链表:
* @param head 头节点;
* @param tail 尾节点;
*/
public Node<Students> constructNode(Node<Students> head){
//构造第一个节点:
head = new Node(new Students(1,"first1"));
Node<Students> tail = head;
//构造第二个节点:
tail.next = new Node(new Students(2,"first2"));
tail = tail.next;
for(int i=3;i<10;i++){
tail.next = new Node(new Students(i,"first"+i));
tail = tail.next;
}
return head;
}
}
/**
* 节点声明:
* @author dada
*
* @param <E>
*/
class Node<E> {
E item;
Node<E> next;
//构造函数
Node(E element) {
this.item = element;
this.next = null;
}
}
class Students {
private int id;
private String name;
public Students(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return " "+"Students [id=" + id + ", name=" + name + "]";
}
}
相关文章推荐
- C_线性表----单链表的基本操作(构表、插入、删除、倒序、输出)
- 剑指offer 01-06解答思路以及代码(顺序数组找特定数字,替换空格字符,链表反转输出,重建二叉树,两个栈实现队列效果,旋转数组最小元素)
- 【100题】第六十一题~第六十五题(数组中只出现一次的数、链表公共点、删除字串特定字符、寻找丑数、输出从1到最大的N 位数)
- 输入一个链表,反转链表后,输出链表的所有元素。
- 链表建立,插入,删除,输出
- JAVA之旅(十七)——StringBuffer的概述,存储,删除,获取,修改,反转,将缓存区的数据存储到数组中,StringBuilder
- 数据结构-链表创建,删除,插入,反转,连接
- 笔试面试之倒序输出链表
- 单链表中结点删除、排序与反转
- 输出反转链表
- 学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
- 单链表的基本操作,正序/逆序建表(尾插法/头插法)、计算单链表长度、输出单链表内容、插入、删除,给出完整代码
- 链表 倒序输出
- leetcode第一题 将一个字符串的单词顺序反转输出
- 数据结构:线性表(顺序存储)顺序表类(实现顺序表的创建,输出,插入,删除功能)
- *(5)输入互不相同的一组整数,构造一棵二叉排序树,要求: ① 按递减有序的顺序输出; ② 输入一个整数,查找该整数是否在该二叉排序树中,查找成功返回1,否则返回0; ③ 在②中,若查找成功,则将该结
- 单链表建立(头插法,头插法,用数组),求长,插入,删除,输出,释放(递归释放和循环释放),归并(递增和递减)
- 将一个值插入到有序的单链表,实现插入、删除、输出等基本操作
- 【1】 设一个长度为10的整型数组,  0)要求每个元素的值通过scanf输入,输入完成后,  1)请顺序输出这些整数,  2)请倒序输出这些整数,  3)输出这些数中的最大值,最小值
- 【1138】数据结构上机测试2-1:单链表操作A(顺序建表+删除节点)(SDUT)