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

创建链表(头插法)

我们知道,在数据结构中链表一般有两个部分: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;//返回头结点

}

示意图如下:

c724f70b9a7b797b0a640066d876493f.png

创建链表(尾插法)

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

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为空,那么相当于第一个结点,将tail顺便一起指向这个节点

else

{

tail.next=p;//将当前节点的next指针域指向下一个节点。

tail=p;//tail后移。

}

m=input.nextInt();

}

return head;//返回头结点

}

反转链表

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

77ef22c3fe80ab71bb213a89958fdd2f.png

所以我们所需要做的就是从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

}

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值