创建链表(头插法)
我们知道,在数据结构中链表一般有两个部分: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为空,那么相当于第一个结点,将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
}
这是我的第一篇博客,如有描述的不对,烦请各位指出,多多包涵!谢谢大家。