线性链表的基本操作
// 面试题5-1-链表基本操作.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stack>
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
/********链表的基本操作*************/
//创建结点
ListNode* CreateListNode(int value)
{
ListNode* pNode = new ListNode();
pNode->m_nKey = value;
pNode->m_pNext= NULL;
return pNode;
}
//链接结点
void ConnectListNode(ListNode* pNode1, ListNode* pNode2)
{
if(pNode1 == NULL)
return;
pNode1->m_pNext = pNode2;
}
//遍历链表
void PrintListNode(ListNode* pHead)
{
if(pHead == NULL)
return;
ListNode* pNode = pHead;
while(pNode != NULL)
{
printf("%d ", pNode->m_nKey);
pNode = pNode->m_pNext;
}
printf("\n");
}
//销毁链表
void DestroyListNode(ListNode* pHead)
{
ListNode* pNode = pHead;
while(pNode != NULL)
{
pNode = pNode->m_pNext;
delete pHead;
pHead = pNode;
}
}
//链表的尾部添加某结点
void AddToTail(ListNode* &pHead, int value) //pHead是局部变量
{
ListNode* pNew = new ListNode();
pNew->m_nKey = 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)
return;
ListNode* pNode = NULL;
if(pHead->m_nKey == value)
{
pNode = pHead;
pHead = pHead->m_pNext;
delete pNode;
pNode = NULL;
}
else
{
pNode = pHead;
//找到要找结点的前一个结点
while(pNode->m_pNext->m_nKey != value && pNode->m_pNext != NULL)
pNode = pNode->m_pNext;
if(pNode->m_pNext != NULL && pNode->m_pNext->m_nKey == value)
{
ListNode* pToBeDeleted = pNode->m_pNext;
pNode->m_pNext = pNode->m_pNext->m_pNext;
delete pToBeDeleted;
pToBeDeleted = NULL;
}
}
}
/***********测试链表基本功能*****************/
void Test1()
{
//创建链表结点
ListNode* pNode1 = CreateListNode(1);
ListNode* pNode2 = CreateListNode(2);
ListNode* pNode3 = CreateListNode(3);
ListNode* pNode4 = CreateListNode(4);
ListNode* pNode5 = CreateListNode(5);
ListNode* pNode6 = CreateListNode(6);
//连接链表结点
ConnectListNode(pNode1,pNode2);
ConnectListNode(pNode2,pNode3);
ConnectListNode(pNode3,pNode4);
ConnectListNode(pNode4,pNode5);
ConnectListNode(pNode5,pNode6);
//打印链表
PrintListNode(pNode1);
//删除结点3,6
RemoveNode(pNode1,1);
RemoveNode(pNode1,6);
PrintListNode(pNode1);
//链表中添加某结点,100
ListNode* pNode100 = NULL; //空链表
AddToTail(pNode100, 100);
PrintListNode(pNode100);
//销毁链表
DestroyListNode(pNode1);
}
int _tmain(int argc, _TCHAR* argv[])
{
Test1();
return 0;
}