链表(15)----给定链表中间某个节点,将待插入节点插入给定节点之前

1、 链表定义

typedef struct ListElement_t_ {
    void *data;
    struct ListElement_t_ *next;
} ListElement_t;

typedef struct List_t_{
    int size;
    int capacity;
    ListElement_t *head;
    ListElement_t *tail;
} List_t;

2、给定链表中间某个节点,将待插入节点插入给定节点之前

先将待插入节点插入给定节点之后,然后交换这两个节点数据,就相当于将带插入节点插入给定节点之前

int InsertNode( ListElement_t *GNode, ListElement_t *TNode){
    if( GNode == NULL || TNode == NULL )
        return ERROR;

    TNode->next = GNode->next;
    GNode->next = TNode;

    void *tmp = GNode->data;
    GNode->data = TNode->data;
    TNode->data = tmp;

    return 0;
}
时间: 2024-11-08 13:57:34

链表(15)----给定链表中间某个节点,将待插入节点插入给定节点之前的相关文章

删除单向链表中间的某个节点,假定你只能访问该节点

1 /* 2 * 在这个问题中你访问不到链表的首节点,只能访问那个待删除节点,其实我们可以这样想 3 * 就是把后继结点的值复制到当前节点,当前节点的下一个地址指向后继结点的下一个地址 4 * 把删除当前节点的问题转化为删除后继结点的问题 5 * 在这里要注意以下,就是如果待删除的是链表的尾节点,则这个问题无解 6 * */ 7 public static boolean deleteNode(Node node) 8 { 9 if(node==null || node.next==null)

数据结构和算法设计专题之---判断单链表中是否有环,环的长度,环的入口节点

题目: 给定一个单链表,只给出头指针head: 1.如何判断是否存在环? 2.如何知道环的长度? 3.如何找出环的连接点在哪里? 4.带环链表的长度是多少? 解法: 1.对于问题1,使用追赶的方法,设定两个指针slow.fast,从头指针开始,每次分别前进1步.2步.如存在环,则两者相遇:如不存在环,fast遇到NULL退出. 2.对于问题2,记录下问题1的碰撞点p,slow.fast从该点开始,再次碰撞所走过的操作数就是环的长度s. 3.问题3:有定理:碰撞点p到连接点的距离=头指针到连接点的

15.单向链表的一些基本操作实现

运行截图: 链表定义 struct LinkNode { int data; struct LinkNode *pNext; }; typedef struct LinkNode node; 尾部添加节点 void addback(node **phead, int data) { //先创建新的结点 node *pnew = (node *)malloc(sizeof(node)); pnew->data = data; pnew->pNext = NULL; //如果头结点为空 if (*

链表问题----删除链表的中间节点和a/b处的节点

删除链表的中间节点和a/b处的节点 对于给定一个链表的头节点head,实现删除链表的中间节点的函数. 例如 不删除任何节点: 1->2,删除节点1 1->2->3,删除节点2 1->2->3->4,删除节点2 1->2->3->4->5,删除节点3 如果将本问题复杂一下,给定链表的头节点head.整数a和整数b,实现删除位于a/b处节点的函数. 例如 链表:1->2->3->4->5,假设 a/b 的值为r 如果 r 等于

给定链表的头指针和一个结点指针,在O(1)时间删除该结点

题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点. 具体思路:把头结点的数据直接copy到要删除的结点处,然后头指针向后移动一个结点,再free掉原来的头指针指向的结点,这样等于把要删除的结点删除了.当链表只有一个结点或者要删除的结点是头结点或尾结点时,这种方法也是成立的,所以不需要做特殊的处理.假设链表总共有n个结点,我们的算法在n-1总情况下时间复杂度是O(1),只有当给定的结点处于链表末尾的时候,时间复杂度为O(n).那么平均时间复杂度[(n-1)*O(1)+O(n)]/n,

2.2 在单链表和双链表中删除倒数第K个节点

题目:分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点 要求:如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1) My: 删除单链表或双链表中倒数第K个节点,核心代码(单链表和双链表的方法定义参见另一篇文:https://www.cnblogs.com/latup/p/9823179.html): 1 def del_k(L, k): 2 index = L.length - k + 1 3 L.delt(index) 原文地址:htt

单向非循环链表:链表创建、节点插入、链表打印、节点长度计算、链表清空、链表销毁

/* 单向非循环链表:    初始化    前插入 后插入    打印    链表长度    清空    销毁*/#include <stdio.h>#include <stdlib.h> #define itemType int typedef struct node{    itemType data;    struct node *pNext;}Node; /* 创建Head节点: 节点的pNext为NULL */int initList(Node **ppN){    N

15 反转链表ReverseList

输入一个链表,反转链表后,输出新链表的表头. 1 import java.util.*; 2 /* 3 public class ListNode { 4 int val; 5 ListNode next = null; 6 7 ListNode(int val) { 8 this.val = val; 9 } 10 }*/ 11 public class Solution { 12 public static ListNode ReverseList(ListNode head) { 13 L

15.反转链表

题目描述 输入一个链表,反转链表后,输出新链表的表头. 题目解答 /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class Solution { public ListNode ReverseList(ListNode head) { ListNode pre=null; ListNode next=null; while(hea