链表中头结点必须为二级指针及原因

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <stack>

 struct ListNode
 {
     int value;
     ListNode* next;
 };
 void AddToList(ListNode** pHead, int value)
 {
     ListNode* node = new ListNode;
     node->value = value;
     node->next = NULL;
     if (*pHead == NULL)
     {
         *pHead = node; //当头结点为空时,新插入的结点就是链表的头指针。但是由于会改动头指针,因此必须把pHead参数设为指向指针的指针。否则这个函数的pHead仍然是一个空指针。
     }
     else
     {
         ListNode* p = *pHead;
         while (p->next != NULL)
         {
             p = p->next;
         }
         p->next = node;


     }


 }

void RmoveNode(ListNode** pHead, int value)
 {
     if (pHead == NULL || *pHead == NULL)
        return;
     ListNode* pToBeDelete = NULL;
     if ((*pHead)->value == value)
     {
         pToBeDelete = *pHead;
         *pHead = (*pHead)->next;
     }
     else
     {
         ListNode* p = *pHead;
         ListNode* q = p->next;
         if (q == NULL)
            return;
         while (q->value != value && q->next != NULL)
         {
             q = q->next;
             p = p->next;
         }
         if (q->value == value)
         {
             pToBeDelete = q;
             p->next = q->next;
         }
     }
     if (pToBeDelete != NULL)
     {
         delete pToBeDelete;
         pToBeDelete = NULL;
     }
 }

 void printReversely(ListNode* pHead)
 {
     if (pHead == NULL)
        return;
     stack<int> stk;
     ListNode* p = pHead;
     while (p != NULL)
     {
         stk.push(p->value);
         p = p->next;
     }
     while(!stk.empty())
     {
         printf("%d\t", stk.top());
         stk.pop();
     }
 }
 void printReverselySelf(ListNode* pHead)
 {
     if (pHead == NULL)
        return;
     else if (pHead->next == NULL)
        printf("%d\t", pHead->value);
    else
    {
         printReverselySelf(pHead->next);
         printf("%d\t", pHead->value);
    }


 }

 int main()
 {

     ListNode* head = NULL;
     int i;
     for (i = 0; i < 10; i++)
     {
         AddToList(&head, i);
     }
     ListNode* p = head;
     while (p != NULL)
     {
         printf("%d\t", p->value);
         p = p->next;
     }
     printReversely(head);
     printReverselySelf(head);
      RmoveNode(&head, 0);
       p = head;
        while (p != NULL)
     {
         printf("%d\t", p->value);
         p = p->next;
     }




     return 0;

 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值