不管采用哪种方法,首先应创建表头,目的是使第一个实际节点和后面的节点是等同的,不会因为删除、插入等操作区分开考虑。
头插法:不断的将新节点插入到表头后面。
package singleLinklistReverse; public class Creat { //定义节点类 public class Lnode{ int data; Lnode next; } public void creatLinklist(String s){ Lnode first=new Lnode(); first.next=null; for(int i=0;i<s.length();i++){ Lnode lnode=new Lnode(); lnode.data=s.charAt(i)-‘0‘; lnode.next=first.next; first.next=lnode; } Lnode p=first.next; while(p!=null){ System.out.println(p.data); p=p.next; } } public static void main(String[] args) { // TODO Auto-generated method stub Scanner scanner=new Scanner(System.in); String s=scanner.nextLine(); Creat creat=new Creat(); creat.creatLinklist(s); } } 控制台输入:12345 输出:5 4 3 2 1
看到输出结果,大家就会知道头插法会改变数据输入顺序。在严格要求数据顺序不变时,可以用尾插法。
尾插法:新来的节点插入到当前节点末尾处。
package singleLinklistReverse_2; import singleLinklistReverse.Reverse; public class Creat { //定义节点类 public class Lnode{ int data; Lnode next; // public Lnode(int d){ // this.data=d; // } } //定义链表类 public class linkList{ } /** * 采用尾插法来建立单链表 * @param s 接收来自控制台输入的字符串 */ public void creatLinklist(String s){ Lnode first=new Lnode(); first.next=null; Lnode r=first; for(int i=0;i<s.length();i++){ Lnode lnode=new Lnode(); lnode.data=s.charAt(i)-‘0‘; r.next=lnode; r=lnode; } r.next=null; Lnode p=first.next; while(p!=null){ System.out.println(p.data); p=p.next; } } public static void main(String[] args) { // TODO Auto-generated method stub Scanner scanner=new Scanner(System.in); String s=scanner.nextLine(); Creat creat=new Creat(); creat.creatLinklist(s); } } 结果: 12345 1 2 3 4 5
显然尾插法稳定性更好。
以上转载自:https://blog.csdn.net/shuaishuai3409/article/details/50756406
以下转载自:https://blog.csdn.net/qq_40938077/article/details/80216563
定义一个链表类型的指针l,指针l指向的是链表的首地址,而不是链表的第一个数,指针l指向的下一个链表类型才是链表的第一个数,每次往链表中加数都加到链表中的第1个位置(即指针l指向的位置)。
#include<bits/stdc++.h> using namespace std typedef struct Node { int value; struct Node *next; }node,*linkedlist; linkedlist linkedlistcreath()//返回的是该链表的地址 { node *l=(node*)malloc(sizeof(node)); l->next=NULL; int number; while (scanf("%d",&number)!=EOF) { node *p=(node*)malloc(sizeof(node));//新建一个node结构并为其申请空间 p->value=number;//给新建的node结构赋值 p->next=l->next;//赋值p所指的节点(就是l所指的节点,即链表的第2个节点) l->next=p;//将l所指的节点更新为p点 } return l;//返回头节点地址 }
还是先定义一个链表类型的指针l,指针l指向的是链表的首地址,而不是链表的第一个数,指针l指向的下一个链表类型才是链表的第一个数,然后定义一个r指针,保证r指针始终指向链表的最后一个位置上的节点,然后让新加的节点加入到r指针指向的节点的后面。
#include<bits/stdc++.h> using namespace std; typedef struct Node { int value; struct Node *next; } node,*linkedlist; linkedlist linkedlistcreatt()//返回的是该链表的地址 { node *l=(node*)malloc(sizeof(node)); l->next=NULL; node *r;//r指向的始终是该链表的最后一个node结构 r=l;//这个地方是地址之间的赋值,所以对r操作就相当于对l操作,即对链表最后一个node结构操作 int number; while (scanf("%d",&number)!=EOF) { node *p=(node*)malloc(sizeof(node));//新建一个node结构并为其申请空间 p->value=number;//给新建的node结构赋值 r->next=p;//将p插入到链表的最后一个node结构的后面 p->next=NULL;//此时p已经是链表的最后一个了,给p的next赋值 r=p;//让r等于链表的最后一个node结构,即p节点 } return l;//返回头节点的地址 }
转载:https://blog.csdn.net/qq_40938077/article/details/80216563
原文:https://www.cnblogs.com/day1day1up/p/14887592.html