链表的创建、插入结点、删除节点等操作
// 单向链表的结构
struct ListNode
{
int m_nValue;
ListNode* m_pNext;
};
//尾部插入结点
void AddToTail(ListNode** pHead, int value)
{
ListNode *pNew = new ListNode();
pNew->m_nValue = value;
pNew->m_pNext = NULL;
if (*pHead == NULL)
{
*pHead = pNew;
}
else
{
ListNode *pNode = *pHead;
while (pNode->m_pNext != NULL)
{
pNode = pNode->m_pNext;
}
pNode->m_pNext = pNew;
}
}
//删除指定值的结点
void RemoveNode(ListNode **pHead, int value)
{
if (*pHead == NULL || pHead == NULL)
{
return;
}
ListNode *pToBeDelected = NULL;
if ((*pHead)->m_nValue == value)
{
pToBeDelected = *pHead;
(*pHead) = (*pHead)->m_pNext;
}
else
{ //从该节点的后一个开始排查,感觉有点麻烦
ListNode *pNode = *pHead;
while (pNode->m_pNext->m_nValue != value && pNode->m_pNext != NULL)
{
pNode = pNode->m_pNext;
}
if (pNode->m_pNext != NULL && pNode->m_pNext->m_nValue == value)
{
pToBeDelected = pNode->m_pNext;
pNode->m_pNext = pNode->m_pNext->m_pNext;
}
}
if (pToBeDelected != NULL)
{
delect pToBeDelected;
pToBeDelected = NULL;
}
}
//从尾到头打印链表(不允许修改链表结构),先入后出,栈
void PrintList(ListNode* pHead)
{
stack<ListNode*> nodes;
ListNode *pNode = pHead;
while (pNode != NULL)
{
nodes.push_back(pNode);
pNode = pNode->m_pNext;
}
while (nodes != NULL)
{
pNode = nodes.top();
printf("%d\t", pNode->m_nValue);
nodes.pop();
}
}
//递归就是一种栈结构,采用递归来实现
void PrintList(ListNode* pHead)
{
if (pHead != NULL)
{
if (pHead->m_pNext != NULL)
{
PrintList(pHead->m_pNext);
}
}
printf("%d\t", pHead->m_nValue);
}