#include <iostream>
#include <stack>
using namespace std;
//链表结构体
struct ListNode
{
int m_nValue;
ListNode*m_pNext;
};
//是否为空
bool isEmpty(ListNode*list){
return list->m_pNext == NULL;
}
//position是否是最后一个
bool isLast(ListNode*position, ListNode*list){
return position->m_pNext == NULL;
}
//在链表中找到某个元素
ListNode* Find(int value, ListNode*list){
ListNode*pNode = list->m_pNext;//指向第一个
while (pNode!=NULL&&pNode->m_nValue!=value)
{
pNode = pNode->m_pNext;
}
return pNode;
}
//找到某一个元素的前驱节点
ListNode* FindPrevious(int value, ListNode*list){
ListNode*pNode = list;//指向头结点
while (pNode->m_pNext!=NULL&&pNode->m_pNext->m_nValue!=value)
{
pNode = pNode->m_pNext;
}
return pNode;
}
//移除某个节点
void deleteNode(int value, ListNode*list){
if (list==NULL)
{
return;
}
ListNode* pToBeDeletedNode=NULL;
ListNode* pNode=list;
//pNode = FindPrevious(value, list);//找到之前的节点
while (pNode->m_pNext != NULL&&pNode->m_pNext->m_nValue != value)
{
pNode = pNode->m_pNext;
}
if (pNode->m_pNext!=NULL) //不是最后一个
{
pToBeDeletedNode = pNode->m_pNext;//待删除的节点
pNode->m_pNext = pToBeDeletedNode->m_pNext;//指向待删除节点的下一个节点
//释放待删除的节点
delete pToBeDeletedNode;
pToBeDeletedNode = NULL;
}
else{ //不存在这个节点
return;
}
}
//将一个元素插入到pToBeInsertedNode指示的节点之后,元素的值为value
void insertNode(int value, ListNode*list, ListNode*pToBeInsertedNode){
if (list==NULL||pToBeInsertedNode==NULL)//不合法
{
return;
}
ListNode*pNewNode = new ListNode();
if (pNewNode==NULL) //分配失败
{
return;
}
pNewNode->m_nValue = value;
pNewNode->m_pNext = pToBeInsertedNode->m_pNext;
pToBeInsertedNode->m_pNext = pNewNode;
}
//在末尾添加元素
void addToTail(ListNode*list, int value){
//一个新的节点
ListNode*pNewNode = new ListNode();
if (pNewNode==NULL) //申请失败
{
return;
}
pNewNode->m_nValue = value;
pNewNode->m_pNext = NULL;
if (list==NULL) //链表为空,那就等于头节点
{
list = pNewNode;
}
else{
ListNode*pNode = list;
while (pNode->m_pNext!=NULL)
{
pNode = pNode->m_pNext;
}
pNode->m_pNext = pNewNode;//最后一个的下一个节点指向新节点
}
}
//删除整个链表
void deleteList(ListNode*list){
if (list==NULL)
{
return;
}
ListNode*pNode = list->m_pNext;
ListNode*pTemp = NULL;
list->m_pNext = NULL; //断开头结点
while (pNode!=NULL)
{
pTemp = pNode->m_pNext;//需要保存其下一个节点
delete pNode;
pNode = pTemp; //移到下一个节点
}
}
//打印链表
void printList(ListNode*list){
if (list==NULL)
{
return;
}
ListNode*pNode = list->m_pNext;
while (pNode!=NULL)
{
cout << pNode->m_nValue << " ";
pNode = pNode->m_pNext;
}
cout << endl;
}
//逆序打印链表
void printListReversingly(ListNode*list){
stack<ListNode*> nodes;
ListNode*pNode = list->m_pNext; //不压入头部
while (pNode!=NULL)
{
nodes.push(pNode);//压栈
pNode = pNode->m_pNext;
}
while (!nodes.empty()){ //不为空
ListNode*pTemp = nodes.top(); //获取顶端元素
cout << pTemp->m_nValue << " ";
nodes.pop();//弹出
}
cout << endl;
}
//判断一个链表是否有环
bool LinkListHasLoop(ListNode*pHead){
ListNode*p = pHead;
ListNode*q = pHead;
while (p != NULL && q != NULL)
{
p = p->m_pNext;//p走一步
q = q->m_pNext;
if (q != NULL)
q = q->m_pNext;//q走两步
if (p != NULL && p == q)//p没有到末尾,且q追上了p说明有环
return true;
}
return false;
}
//测试
int main(){
ListNode* list = new ListNode();
for (int i = 0; i < 10;i++)
{
addToTail(list, i);
}
cout << "打印链表:" << endl;
printList(list);
cout << "逆序打印链表:" << endl;
printListReversingly(list);
cout << "在末尾添加元素:10" << endl;
addToTail(list, 10);
printList(list);
cout << "移除节点值为5的节点:" << endl;
deleteNode(5, list);
printList(list);
cout << "找到节点值为6的节点的前驱节点:" << endl;
ListNode* pNode=FindPrevious(6, list);
cout << pNode->m_nValue << endl;
cout << "删除链表:" << endl;
deleteList(list);
printList(list);
cout << "链表是否为空:" << endl;
cout << isEmpty(list) << endl;
return 0;
}