首页 > 其他 > 详细

【转】头插法和尾插法

时间:2021-06-15 23:59:21      阅读:27      评论:0      收藏:0      [点我收藏+]

不管采用哪种方法,首先应创建表头,目的是使第一个实际节点和后面的节点是等同的,不会因为删除、插入等操作区分开考虑。

头插法:不断的将新节点插入到表头后面。

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

方法1:头插法

基本思路:

定义一个链表类型的指针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;//返回头节点地址
 
}

技术分享图片

方法2:尾插法

基本思路:

还是先定义一个链表类型的指针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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!