单链表中实现删除节点

根据给定的数值,遍历链表,删除对应节点有两种可能:

①:找到一个节点的data域为给定的数值,删除这个节点,函数返回。实现代码如下:

/*Delete one node of given value

void DeleteOneNodeFromList(Node **pList,int value)
{
  Node *pCurrent;

  while((pCurrent=*pList)!=NULL && pCurrent->data != value)
  {
    pList = &(pCurrent->next);
  }

  if(NULL == pCurrent)
  return ;

  *pList = pCurrent->next;
  free(pCurrent);
  return ;
}
*/

②:删除链表中所有数据域data值为给定值value的节点。实现代码如下:

/*Delete all of the node whose data is equal to value
**
**/
void DeleteDataFromList(Node **pList,int value)
{
  Node *pCurrent;

  while((pCurrent = *pList) != NULL)
  {
    if(value == pCurrent->data)
    {
      *pList = pCurrent->next;
      free(pCurrent);
    }
    else
    {
      pList = &(pCurrent->next);
    }
  }

}

时间: 2024-10-23 08:41:35

单链表中实现删除节点的相关文章

链表:在不给出整个链表头结点的情况下,删除单链表中的某个节点

问题描述: 有一个包含int型节点值的单链表,给定一个链表中的节点node,但不给定整个链表的头结点,删除链表中的某个结点. 算法实现: class Node { public int value; public Node next; public Node(int value) { this.value = value; } } public void removeWiredNode(Node node) { if(node == null) { return; } Node next = n

[转]用O(1)的时间复杂度删除单链表中的某个节点

给定链表的头指针和一个结点指针,在O(1)时间删除该结点.链表结点的定义如下: struct ListNode {      int        m_nKey;       ListNode*  m_pNext; }; 函数的声明如下: void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted); 这是一道广为流传的Google面试题,考察我们对链表的操作和时间复杂度的了解,咋一看这道题还想不出什么较好的解法,但人家把题出在这,肯定

用O(1)的时间复杂度删除单链表中的某个节点

给定链表的头指针和一个结点指针,在O(1)时间删除该结点.链表结点的定义如下: struct ListNode { int m_nKey; ListNode* m_pNext; }; 函数的声明如下: void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted); 这是一道广为流传的Google面试题,考察我们对链表的操作和时间复杂度的了解,咋一看这道题还想不出什么较好的解法,但人家把题出在这,肯定是有解法的.一般单链表删除某个节点,需

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

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

无表头单链表的总结----删除节点

1 #include "head.h" 2 struct Student*del(struct Student*head,char num[N]) 3 { 4 struct Student*p1, *p2; 5 if (head == NULL) //若链表为空,则无需处理 6 { 7 printf("\nlist NULL!\n"); 8 return (head); 9 } 10 p2 = p1 = head; 11 while (strcmp(num, p1-

单链表 - 插入和删除操作

下图展示了单链表的基本结构: head指针是链表的头指针,指向第一个节点,每个节点的next指针域指向下一个节点,最后一个节点的next指针域为NULL,在图中用0表示. 下面先来看程序(栈的链式存储实现,另外一个实现点这里)和对应的输出(注意输出前进行了链表反转(见<单链表反转>,否则程序后面的while循环输出的顺序是250,200,100),接着来分析程序: C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

83. 移除已排序链表中重复的节点 Remove Duplicates from Sorted List

Given a sorted linked list, delete all duplicates such that each element appear only once. For example,Given 1->1->2, return 1->2.Given 1->1->2->3->3, return 1->2->3. 移除单链表中重复的节点 public class Solution { public ListNode DeleteDup

从无头单链表中删除节点

1.从无头单链表中删除节点 一个没有头指针的单链表.一个指针指向此单链表中间的一个节点(不是第一个也不是最后一个节点).将该节点删除. A-->B-->C-->D       =====>     A-->C-->D 问题解析:由于只能单向遍历,故与删除B节点,无法得知B的前驱A,即无法像普通删除中那样让A的next指向C; 这里有个技巧,将C当做B,而B复制成C,则删除C节点即可: 2.给定一个链表的头指针,要求只遍历一次,将单链表中的元素顺序反转过来. A-->

编程之美:从无头单链表中删除节点,讨论

1.问题描述 假设有一个没有头指针的单链表.一个指针指向此单链表中间的一个节点(不是第一个,也不是最后一个),请将该节点从单链表中删除. 如下图所示: 这种情况大家都知道,将下一个节点的data和next拷贝到当前节点,并将当前节点的next设置为下下个节点,然后释放下一个节点所占内存(free), 如果红字条件去掉: 还用上面的方法就有问题,一般上面方法的代码如下: void DeleteRandomNode(Node* pCurrent) { if(pCurrent == NULL) ret