我们知道,在数据结构中链表一般有两个部分: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 }这是我的第一篇博客,如有描述的不对,烦请各位指出,多多包涵!谢谢大家。