双向链表的插入

问题:

给定一个已排序的双向链表,向其中插入一个元素。

solution:

struct ListNode {
    int val;
    ListNode *prev;
    ListNode *next;
};

int insert(ListNode *head, int value)
{
    ListNode *cur;
    ListNode *next;
    for (cur = head; (next = cur->next) != NULL; cur = next)
    {
        if (next->val == value)
            return 0;
        if (next->val > value)
            break;
    }

    ListNode *newNode = new ListNode;
    newNode->val = value;

    newNode->next = next;
    cur->next = newNode;
    if (cur != head)
        newNode->prev = cur;
    else
        newNode->prev = NULL;
    if (next != NULL)
        next->prev = newNode;
    else
        head->prev = newNode;
    return 1;
}

有两点需要注意:

1. 声明一个头结点head,其中head->prev指向链表最后一个结点,head—>next指向链表第一个结点。

2. 当插入元素和链表中元素重复时,不执行插入操作。

reference:

《C和指针》

时间: 2024-11-05 16:08:55

双向链表的插入的相关文章

双向链表的插入(及其疑问)

本人刚学,有很多问题,希望大家帮忙指出,谢谢 #include<stdio.h>#include<stdlib.h>#define datatype int typedef struct node{ datatype data; struct node *prev; struct node *next;}listnode,*mylist; //双向链表的初始化 mylist init(void){ mylist list=(mylist )malloc(sizeof(listnod

双向链表(插入,删除,追加,正反向遍历,查找。。。)

#include <iostream> #include <stdexcept> using namespace std; class List { public: List(void) : m_head(NULL), m_tail(NULL), m_size(0){} ~List(void) { for(Node* node = m_head; m_head; m_head = node) { node = m_head->m_next; delete m_head; }

数据结构之双向链表的插入

#include<iostream>#include<malloc.h>#include<stdlib.h>#include<stdio.h>using namespace std; typedef struct node{ char data; struct node *prior; struct node *next; } lnode,*linklist; int init(linklist *head) { (*head)=(linklist)mall

数据结构-编程实现一个双向链表节点的插入

1:这里分为两种插入情况:一种是 插入位置在中间,另一种是插入位置在末尾.两种情况有一点不同:插入位置在中间时需要把p的原后继节点的前驱指针指向新插入的节点. // ConsoleApplication24.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<malloc.h> #include <iostream> #include <assert.h> using namespace std;

双向链表的建立、插入、删除、

双向链表简介 在循环链表中虽然能够实现从任一一结点出发找到其前驱,但时间复杂度是O(n),从表中希望迅速找到其前驱,可为每个结点增加一个指向其前驱的指针prior,这样链表中有两条方向不同的链,称为双向链表 typedef struct Node { int data; struct Node *prior,*next;//prior前驱,next后继 }Node,*DoubleLinkList; p指向双向链表中某一结点,以下成立 p->prior->next==p; p->next-

双向链表的实现

上一篇博文介绍了如何使用C语言实现单链表,这篇博文介绍下双向链表的实现.单链表中每个结点只有一个后驱,而双向链表中每个结点都有一个后驱和前驱(除了第一个结点只有一个后驱,最后一个结点只有一个前驱).双向链表中每个结点具有一个数据域和两个指向前一个结点和后一个结点的指针域.代码的实现: 首先得创建一个结点的结构体:Double_Node typedef struct Double_Node { int data; Double_Node *front; Double_Node *next; }Do

C语言之双向链表

1,双向链表简介.双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循环链表. 2,例子要求:完成双向链表的插入.删除以及查找,将学生管理系统使用的数组,以双向链表的方式实现,能够支持无限制的学生人数的增删改查以及保存. 3,代码实现.#include <stdio.h>#include <string.h>#include <stda

数据结构——双向链表的实现

双向链表主要为了解决单链表找前驱的问题.除了插入.删除操作之外,其他操作与单链表都相同.因此这里只是比较简单的写了双向链表的插入和删除操作.画出结点结构图的话,思路会很清晰,线性表这块还算是比较简单的能够实现. 1 /* 2 在单链表中,求后继的方法NextElem执行的时间为O(1),求前驱的方法PriorElem执行的时间为O(n), 3 引入双向链表就是为了克服单链表这种单向性的缺点. 4 */ 5 6 #include<stdio.h> 7 #include<stdlib.h&g

一步一步写算法(之双向链表)

原文:一步一步写算法(之双向链表) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前面的博客我们介绍了单向链表.那么我们今天介绍的双向链表,顾名思义,就是数据本身具备了左边和右边的双向指针.双向链表相比较单向链表,主要有下面几个特点: (1)在数据结构中具有双向指针 (2)插入数据的时候需要考虑前后的方向的操作 (3)同样,删除数据的是有也需要考虑前后方向的操作 那么,一个非循环的双向链表操作应该是怎么样的呢?我们可以自己尝试一下: (