您的位置:首页 > 编程语言 > Java开发

在JAVA中如何创建一个链表(头插法、尾插法)以及反转链表

2020-07-05 14:40 471 查看

钉钉、微博极速扩容黑科技,点击观看阿里云弹性计算年度发布会!>>>

目录

  • 创建链表(头插法)
  • 创建链表(尾插法)
  • 反转链表

创建链表(头插法)

我们知道,在数据结构中链表一般有两个部分:data以及指针域next。
那么怎么通过data以及next创建一个链表呢?
万物皆有开端,所以我们首先需要创立一个头结点,head。

public static Node createLinkByHead(Scanner reader)
{
Node head=null;
}

然后我们将键盘录入的数据通过while循环按照输入顺序一个结点一个结点的赋值给结点.data(这里我们将数字为0设置为循环的终止条件-----也就是当数值为0时,while循环停止,链表就创建到这里,并不会把0进行赋值)。每次新建一个结点,head都会变成新建的那个结点,所以最后的结点顺序是与录入顺序相反的。

public static Node createLinkByHead(Scanner input)
{
Node head=null;
int m=input.nextInt();
while(m!=0)//进行判断
{
Node p=new Node(m);//创建一个新的对象——p结点。
if(head==null)head=p;//如果头结点为空、将P作为头结点。
else
{
p.next=head;//此前已经有结点,p结点的next指针域指向head
head=p;//将head移到现在的p结点
}
m=input.nextInt();//读取下一个数字。
}
return head;//返回头结点
}

示意图如下:

创建链表(尾插法)

尾插法依然换汤不换药,但是我们需要多出一个指针用来指向尾部的节点。

public static createLinkByTail(Scanner input)
Node head=null;
Node Tail=null;
int m=input.nextInt();

然后我们录入第一个节点之后,录入第二个结点时,head不会再变化,他一直指向第一个录入的节点,而Tail用来进行之前头插法head的赋值指针域的操作。

public static createLinkByTail(Scanner input)
{
Node head=null;
Node tail=null;
int m=input.nextInt();
while(m!=0)
{
Node p=new Node(m);//创建新的对象。
if(head==null)tail=head=p;//如果head为空,那么相当于第一个结点,将
1000
tail顺便一起指向这个节点
else
{
tail.next=p;//将当前节点的next指针域指向下一个节点。
tail=p;//tail后移。
}
m=input.nextInt();
}
return head;//返回头结点
}

反转链表

反转链表,我们脑子里应该可以想象得到怎么反转。也就是像下图:


所以我们所需要做的就是从head开始通过遍历(从第一个到最后一个)一个一个去反转他们的指针,最后将head指向最后一个即可。
整个反转过程可以理解成 (head)1->2->3->null 变成 (head)3->2->1->null。

public static reverseLink(head)
{
Node p=head;//将p作为第一个节点
head=null;
if(p!=null)
{
Node q=p.next;//将当前节点指向下一个结点的指针保存到q里。
p.next=head;//将当前结点指向原来的上一个结点
head=p;//将head后移一个结点;
p=q;//把开始指向的位置赋给p,可以看成p=p.next(原来的);
}
return head
}

这是我的第一篇博客,如有描述的不对,烦请各位指出,多多包涵!谢谢大家。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  next java
相关文章推荐