单链表顺序插入

向单链表中插入新元素,并保证插入后,元素是有序的。

【程序实例】

 1 struct  ListNode
 2 {
 3     int val;
 4     ListNode *next;
 5 };
 6
 7 bool sll_insert(ListNode **root, int value)
 8 {
 9     ListNode *PrevNode =NULL;
10     ListNode *Current = *root;
11
12     while (Current!=NULL && Current->val<value)
13     {
14         PrevNode=Current;
15         Current=Current->next;
16     }
17
18     ListNode *New = new ListNode;
19     if (New == NULL)
20         return false;
21
22     New->val=value;
23
24     New->next=Current;
25
26     if (PrevNode == NULL)
27         *root=New;
28     else
29         PrevNode->next=New;
30
31     return true;
32 }

===============================================================================

改进的方法:

  分析:在上面的方法中,我们需要指定两个指针,一个指向当前结点,一个指向当前结点的前一个结点(注意,其初始化要为NULL,用于标记要插入的位置是否是在第一个结点的位置)。该方法需要区分对待两种情况:

  (1)要插入的位置位于单链表的中部或者尾部,此时指向当前结点的前一个结点的指针的后面的位置即使要新插入的结点的位置,只需要将当前结点连接到新插入结点的后面,即可完成结点的插入:

1 PrevNode->next=New;
2 New->next=Current;

  (2)当要插入结点的位置是一个结点,此时指向当前结点(即第一个结点)的前一个结点的指针PrevNode为NULL(因为它还没来得及在结点中赋值),此时只需要将新插入的结点的下一个结点设为当前结点,而将根节点设置为新插入的结点:

1 New->next=Current;
2 *root=New;

当原始的链表为空时的情况也包含在该情况中。

由于上面的代码需要分情况,下面对算法进行优化:

  我们尝试使用一个指针完成任务,指向当前结点的指针是必不可少的,因为我们需要它访问结点中的val。我们在不断比较的过程中,最终当前结点的指针是指向要插入的结点后一个结点。

  然而,当我们调整结点的形式,使得next域在结点的起始位置,指向该结点的指针的值是该结点的起始位置的地址,此时该地址也是next域的起始位置的指针。当我们要插入结点时,只需要将指向当前结点的next域的指针指向新插入的结点的next域的地址即可,而将新插入节点的next指向当前结点的指针即可。

【程序实例】

 1 struct  ListNode
 2 {
 3     ListNode *next;
 4     int val;
 5 };
 6
 7 int sll_insert(ListNode **root, int value)
 8 {
 9     ListNode *Current=NULL;
10
11     while( (Current=*root)!=NULL && Current->val<value )
12     {
13         root=&Current->next;
14     }
15
16     ListNode *New = new ListNode;
17     if(New ==NULL)
18         return -1;
19     New->val=value;
20
21     New->next=Current;
22     *root=New;            //相对于对第一个大于value的位置进行重新赋值,将旧位置上的指针连接到新插入的结点的后面
23
24     return 0;
25 }
时间: 2024-10-15 11:50:05

单链表顺序插入的相关文章

面试之路(10)-BAT面试之java实现单链表的插入和删除

链表的结构: 链表在空间是不连续的,包括: 数据域(用于存储数据) 指针域(用于存储下一个node的指针) 单项链表的代码实现: 节点类 构造函数 数据域的get,set方法 指针域的get,set方法 代码: public class Node { Object element; //数据域 Node next; //指针域 //构造方法 public Node(Object obj, Node nextval) { this.element = obj; this.next = nextva

单链表的插入伪算法和用C语言创建单链表,并遍历

非循环单链表插入结点伪算法讲解 q插入p之后的伪算法:第一种表示方法:r = p->pNext; // p->pNext表示的是所指向结点的指针域,指针域又是指向下一个结点的地址p->pNext = q; // q保存了那一块结点的地址.q是一个指针变量,存放那个结点的地址.q->pNext = r; 第二种表示方法:q->pNext = p->pNext; // q的指针域指向p后面一个结点p->pNext = q; // p的指针域指向q 删除非循环单链表结点

单链表的插入

预编译 #include <stdio.h> #include <stdlib.h> #define status int #define TRUE 1 #define FALSE 0 数据结构 typedef struct NODE{ struct NODE *next; /* 指向下一个结点 */ int value; /* 存放结点值 */ }Node, *PNode, **List; 插入代码 1 /* 2 功能描述: 3 把一个值插入到单链表(从小到大) 4 5 参数:

[算法]向有序的环形单链表中插入新节点

题目: 一个环形单链表从头节点head开始不降序,同时由最后的节点指回头节点.给定这样一个环形单链表的头节点head和整数num,请生成节点值为num的新节点,并插入到这个环形链表中,保证调整后的链表依然有序. 要求时间复杂度为O(N),额外空间复杂度为O(1). 分析: 本题不算是很难,但是要注意最后返回头节点时要考虑到不同的情况. 有可能要插入的节点的值比头节点的值还小,此时返回的是要插入的节点,否则返回头节点. 程序: public static Node insertNum(Node h

单链表的插入删除操作(c++实现)

下列代码实现的是单链表的按序插入.链表元素的删除.链表的输出 // mylink.h 代码 #ifndef MYLINK_H #define MYLINK_H #include<iostream> using namespace std; struct node { int data; node *next; }; class list { public: list() { head=NULL; }; void insert(int item); void del(int item); voi

单链表实现“插入”和“删除”操作

在单链表中,又如何实现"插入"和"删除"操作呢? 插入操作: 假设我们要在线性表的两个数据元素a和b之间插入一个数据元素x,已知p为其单链表存储结构中指向结点a的指针.为插入数据元素x,首先要生成一个数据域为x的结点,然后插入在单链表中.根据插入操作的逻辑定义,还需修改结点a中的指针域,令其指向结点x,而结点x中的指针域应该指向b结点,从而实现3个元素a,b和x之间逻辑关系的变化. 假设s为指向结点x的指针.则上述指针修改用语句描述即为: s->next=p-

带头节点的单链表的插入操作

1.偶然看到了十字链表的应用,想到之前在<数据结构与算法分析>的链表一章中,需要用多重表实现一个简单的查询功能.功能需求如下: “已知 学生 和 学校课程 总数 分别为 40000 和 2500,现在需要得到两份报告,一份显示每门课成注册的所有学生信息, 一份显示每个学生注册了哪些课程.” 显然可以用一个 40000 * 2500 个元素的二维数组来解决,但是每个学生选课数目很少,因此会浪费很多空间.因此选择十字链表来实现. 既然是链表,那么肯定要有插入操作,于是便有了本文.算是对功能实现前的

单链表的插入操作的实现(0952)SUWST-OJ

Description 建立长度为n的单链表,在第i个结点之前插入数据元素data. Input 第一行为自然数n,表示链式线性表的长度:第二行为n个自然数表示链式线性表各元素值:第三行为指定插入的位置i:第四行为待插入数据元素data. Output 指定插入位置合法时候,输出插入元素后的链式线性表的所有元素,元素之间用一个空格隔开.输入不合法,输出“error!”. Sample Input 5 1 2 3 4 5 3 6 Sample output 1 2 6 3 4 5 代码: #inc

单链表排序(插入与归并)

struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; /* * 单链表的插入排序, 插入排序是一种稳定排序 */ class Solution7 { public: ListNode* insertionSortList(ListNode* head) { if(head == NULL || head->next == NULL) return head; ListNode *