首页 > 编程语言 >17-咸鱼学Java-内部类实际应用-Java链表

17-咸鱼学Java-内部类实际应用-Java链表

时间:2022-12-14 15:05:09浏览次数:46  
标签:Java cur 17 int next 链表 Entry null


​​内部类​​ ,​​未使用内部类的链表​​可以点击名字查看。

此篇文章主要介绍运用内部类的Java链表的写法。

链表正如其名,就像一个一个珠子被串起来,只有前一个珠子和后一个珠子和当前珠子有关系,是一种一对一的数据结构。

17-咸鱼学Java-内部类实际应用-Java链表_头结点


这样的数据结构,在插入和删除节点的时候,会显的特别方便,因为不像数组一样要移动大量的元素,而只需要改变一些引用就可以实现增删。

链表的增加

1)头插法

顾名思义头插法及每次插入都是插入到第一个节点处

17-咸鱼学Java-内部类实际应用-Java链表_结点_02


链表的头插法只需要两步(已经New出了新节点)

1.将1号元素的地址给插入的元素

2.将插入元素的地址给头结点

2)尾插法

17-咸鱼学Java-内部类实际应用-Java链表_头结点_03


链表的尾插法只需要一步(已经New出了新节点)

将插入元素的地址给最后一个元素。

3)插入到指定位置

插入到指定位置和头插法原理基本相同,不过是把插入位置之前的元素当做头结点,其插入进行的操作基本相同,只是需要提前找到相应的位置。

链表的删除

未完待续

链表的遍历

链表的遍历只需要一直移动引用,使得临时引用变量一直向后移动,直到临时引用变量为null,即已经遍历完了所有元素。

链表的长度

原理和遍历相同,只是将基本操作变为计数,切最后将结果return出去。

代码

package com.chenxixuexi;
/**
* 链表
* @author 焦焱
*
*/
public class Link1 {
private Entry head = new Entry(); //指向头结点的引用


/**
* 节点类
* @author 焦焱
*
*/
class Entry{//Entry Node
int data;
Entry next;
/**
* 头结点空构造方法
*/
public Entry() {
data = 0;
next = null;
}
/**
* 构造节点
* @param a
*/
public Entry(int a) {
data = a;
next = null;
}
}

/**
* 头插法
* @param val 需要插入的数据
*/
public void insertHead(int val)
{
//有这么一个节点
Entry cur = new Entry(val);
cur.next = head.next;
head.next = cur;
}

/**
* 尾插法
* @param val 需要插入的值
*/
public void insertTail(int val)
{
Entry cur = head;
while(cur.next!= null) //循环直到cur.next为空 把cur弹出
{
cur = cur.next;
}
cur.next = new Entry(val);//给cur.next 赋值为新节点的地址

}
/**
* 插入到pos位置 从有数据开始为0下标
* @param pos 位置序号
* @param val 插入的值
*/
public void insertPos(int pos,int val)
{
Entry cur = head; //获取头结点
int count = 0;
if(pos<0||pos>getLength()) //如果需要中断操作,只需要在此return即可
System.out.println("下标"+pos+"不合法,自动插入到最后位置");
while(cur.next!= null) //循环直到cur.next为空 把cur弹出 及如果没找到就会把元素插入到最后面
{

if(count == pos)
break;

count++;

cur = cur.next;
}
Entry cur1 = new Entry(val);
cur1.next = cur.next;
cur.next = cur1;
}




/**
* 遍历输出数组
*/
public void show()
{
Entry cur = head.next; //获取到第一个节点
System.out.print("[");
while(cur!=null) //如果cur不是null
{
System.out.print(cur.data+" "); //输出
cur = cur.next; //向下递进
}
System.out.println("]");
}
/**
* 获得链表长度
* @return 链表长度
*/
public int getLength()
{ int count=0;
Entry cur = head.next; //获取到第一个节点
while(cur!=null) //如果cur不是null
{
count++; //计数
cur = cur.next; //向下递进
}
return count;
}
}

翻转链表

17-咸鱼学Java-内部类实际应用-Java链表_头结点_04


通过翻转节点实现链表的翻转。

public void Reversal()
{
Entry<T> p = head.next,p1 = null,p2 = null;
while(p!=null){
p1 = p.next; //设置p1是p结点的后继结点,用p1来保持p的后继结点
p.next = p2; //链接,使p.next指向p结点的前一个结点
p2 = p; //p2向后移一步
p = p1; //p向后移一步
}
head.next = p2; //head.next指向最后一个结点
}

求单链表倒数第K节点

/**
* 求倒数第K个元素
*
* @param k 序号
* @return 所求元素
*/
public int BackWardsToK(int k)
{
if(k>getLength()-1){ //判错
System.err.println("超越限制,下标不合法,倒数下标从0开始");
return 0;
}
int key = getLength()-k;
Entry<T> cur = head; //获取头结点
int count = 0;
while(cur.next!= null) //循环直到cur.next为空 把cur弹出 及如果没找到就会把元素插入到最后面
{

if(count == key)
break;
count++;
cur = cur.next;
}
return cur.data;
}

其原理很简单,倒数第K个,及为第length-k个元素,只需要循环取到第length-k个元素即可。


标签:Java,cur,17,int,next,链表,Entry,null
From: https://blog.51cto.com/u_12938555/5936983

相关文章

  • LeetCode-Java-876. Middle of the Linked List
    题目Givenanon-empty,singlylinkedlistwithheadnodehead,returnamiddlenodeoflinkedlist.Iftherearetwomiddlenodes,returnthesecondmiddlenode.......
  • 咸鱼学Java-多线程基础
    实现多线程的方法1.继承Thread,并且重写run方法(线程体)2.实现Runnable接口,实现run方法(线程体)必须重写run1.继承ThreadclassMyThreadextendsThread{publicMyThr......
  • 剑指Offer-Java-用两个栈实现队列
    题目用两个栈来实现一个队列,完成队列的Push和Pop操作。队列中的元素为int类型。代码只需要来回倒就可以实现了。importjava.util.Stack;publicclassSolution{Stack......
  • 23-咸鱼学Java-Java中的栈
    栈的图示代码/***栈*@author焦焱**/publicclassStack{/***栈顶标记*/inttop;/***栈内元素*/int[]elem;/**......
  • LeetCode-Java-893. Groups of Special-Equivalent Strings
    题目YouaregivenanarrayAofstrings.TwostringsSandTarespecial-equivalentifafteranynumberofmoves,S==T.Amoveconsistsofchoosingtwoindices......
  • LeetCode-Java-575. Distribute Candies
    题目Givenanintegerarraywithevenlength,wheredifferentnumbersinthisarrayrepresentdifferentkindsofcandies.Eachnumbermeansonecandyofthecorr......
  • 能让Java开发者提高效率的10个工具
    ​ Java受到全球百万计开发者的追捧,已经演变为一门出色的编程语言。最终,这门语言随着技术的变化,不断的被改善以迎合变化的市场需求。无论你是否拥有一家科技公司,软件已经......
  • 剑指Offer-Java-重建二叉树
    题目输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍......
  • 剑指Offer-Java-序列化二叉树
    题目请实现两个函数,分别用来序列化和反序列化二叉树代码此题的核心点是如何表示二叉树,并且解释。/*publicclassTreeNode{intval=0;TreeNodeleft=null;......
  • Java做UI自动化和app自动化中动态代理@FindBy的工作原理【杭州多测师_王sir】【杭州多
    Java做UI自动化和app自动化中动态代理@FindBy的工作原理一、背景简介由于Selenium框架采用PageObject设计模式让测试代码与被测页面对象代码分离,因而提供了不少很方便的注......