向升序单向链表中插入一个节点

#include "OJ.h"

/*
功能: 输入一个升序单向链表和一个链表节点,向单向链表中按升序插入这个节点。
	  输入为空指针的情况视为异常,另外不考虑节点值相等的情况。

输入: ListNode* pListHead  单向链表
      ListNode* pInsertNode 新插入节点

输出: ListNode* pListHead  单向链表

返回: 正常插入节点返回链表头指针,其它异常返回空指针
*/
ListNode* InsertNodeToList(ListNode* pListHead, ListNode* pInsertNode)
{
	/*在这里实现功能*/

	if ((ListNode *)NULL == pListHead )
	{
        return (ListNode *)(NULL);
	}
    if ((ListNode *)NULL == pInsertNode )
    {
        return (ListNode *)(NULL);
    }
    if (pInsertNode->m_nKey < pListHead->m_nKey)
    {
        pInsertNode->m_pNext = pListHead;
        pListHead = pInsertNode;
        return (ListNode *)pListHead;
    }
	ListNode* p = pListHead;

    while ((ListNode *)NULL != p->m_pNext && p->m_pNext->m_nKey < pInsertNode->m_nKey)
    {
        p = p->m_pNext;
    }

    pInsertNode->m_pNext = p->m_pNext;
    p->m_pNext = pInsertNode;
	return (ListNode *)pListHead;
}

int main()
{
    ListNode astListNode[2];
    ListNode stInsertNode;
    ListNode *pListHead;

    astListNode[0].m_nKey = 2;
    astListNode[0].m_pNext = &astListNode[1];

    astListNode[1].m_nKey = 3;
    astListNode[1].m_pNext =(ListNode *)(NULL);

    stInsertNode.m_nKey = 4;
    stInsertNode.m_pNext =(ListNode *)(NULL);

    pListHead = InsertNodeToList(astListNode, &stInsertNode);
    return 0;
}

时间: 2024-07-30 08:00:29

向升序单向链表中插入一个节点的相关文章

[华为机试练习题]49.向升序单向链表中插入一个节点

题目 描述: 输入一个升序单向链表和一个链表节点,向单向链表中按升序插入这个节点. 输入为空指针的情况视为异常,另外不考虑节点值相等的情况. 链表结点定义如下: struct ListNode { int m_nKey; ListNode* m_pNext; }; 详细描述: 接口说明 原型: ListNode* InsertNodeToList(ListNode* pListHead, ListNode* pInsertNode); 输入参数: ListNode* pListHead 单向链表

链表中插入一个节点的三种情况

在链表中插入一个元素可以分为三种情况: 1.在节点的时候 2.在链表中间的任意位置 3.在链表的最后位置,也可以认为这种情况为追加(这个就留到追加的时候来实现) 下面是代码的实现 SN *Insert_S_Node( SN *head ) /* 传入的参数是被插入链表中的头指针 */ { SN *Insert_Node=NULL, *Dest_Node = NULL; /* Insert_Node是将要做成的新链表中的节点 Dest_Node是要插入的节点*/ INT32 OSM = 1, i3

[012]链表笔记--在链表中插入一个节点

插入的数目为num,如果比head小,则插在链表头:如果比链表中元素都大,则插在结尾:否则插在链表中: 代码如下: 1 Link* Link::Add(Link* pLink, int num) { 2 Link *p1,*p2; 3 p1 = pLink; 4 Link *p0 = new Link; 5 p0->id = num; 6 7 while ((p0->id > p1->id) && (p1->next != NULL)) { 8 p2 = p1

删除单向链表中的某个节点

删除单向链表中的某个节点 链表的节点删除 在删除链表的节点步骤如下: 1.找到被删除节点的前面一个节点 2.将前面节点的next节点改成下一个节点 3.将被删除节点的内存释放 public class deleteNode { Node head; class Node { int data; Node next; Node(int d) { data = d; next = null; } } void deleteNode(int key) { // Store head node Node

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

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

【剑指Offer】删除链表中重复的节点

题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 A:当遍历到第一个值为重复的节点时,要有一个指针指向它的前一个节点    因为函数原型没有传二级指针进来,且头结点也有可能被删除,所以要构建一个新结点Head 用布尔型的flag_repeat判断是否有重复节点,若有重复节点则删除,若没有重复节点则移动指针 /* struct Li

链表《3》在链表中插入新的结点

下图是一个创建好的链表 下面我们需要在链表中插入一个结点,例如我们需要在第3个结点后插入一个结点 首先定义一个指针p,并且将p移动到第3个结点处 创建一个新结点pNew并且初始化pNew pNew->data = 20 然后定义一个指针q将q指向p第4个结点 最后将p指向pNew,pNew指向q即可实现在链表中第3个结点后插入一个新结点 即: p->pNext = pNew; pNew->pNext = q; 插入后的效果: 程序代码: #include <stdio.h>

[华为机试练习题]24.删除链表中的反复节点、剩余节点逆序输出

题目 描写叙述: 题目描写叙述: 输入一个不带头节点的单向链表(链表的节点数小于100),删除链表中内容反复的节点(反复的节点所有删除),剩余的节点逆序倒排. 要求实现函数: void vChanProcess(strNode * pstrIn,strNode * pstrOut); [输入] pstrIn:输入一个不带头节点的单向链表 [输出] pstrOut:删除内容反复的节点(反复的节点所有删除).剩余节点逆序输出(不带头节点,链表第一个节点的内存已经申请). [注意]仅仅须要完毕该函数功

[华为机试练习题]24.删除链表中的重复节点、剩余节点逆序输出

题目 描述: 题目描述: 输入一个不带头节点的单向链表(链表的节点数小于100),删除链表中内容重复的节点(重复的节点全部删除),剩余的节点逆序倒排. 要求实现函数: void vChanProcess(strNode * pstrIn,strNode * pstrOut); [输入] pstrIn:输入一个不带头节点的单向链表 [输出] pstrOut:删除内容重复的节点(重复的节点全部删除),剩余节点逆序输出(不带头节点,链表第一个节点的内存已经申请). [注意]只需要完成该函数功能算法,中