本博文内容:简历单链表,删除节点,输出节点
逆序输出单链表节点值
单链表逆转
输出单链表的倒数k个节点值
约瑟夫环
1. 单链表实现,以及相关基本操作
struct LinkNode
{
int value;
LinkNode *next;
};
void AddToTail(LinkNode **pHead, int value) //尾插法插入节点
{
LinkNode *pNew = new LinkNode(); //开辟空间用来存储节点值
pNew->value = value;
pNew->next = NULL;
if(*pHead == NULL)
{
*pHead = pNew;
}
else
{
LinkNode *pNode = *pHead;
while(pNode->next!=NULL) //找到最后以后一个节点
pNode = pNode->next;
pNode->next = pNew; //插入节点
}
}
void PrintList(LinkNode *pHead) //输出链表中的节点值
{
LinkNode *pNode = pHead;
while(pNode)
{
cout << pNode->value << " ";
pNode = pNode->next;
}
cout << endl;
}
void RemoveNode(LinkNode **pHead, int value) //从链表中删除节点
{
if(pHead==NULL || *pHead==NULL)
return;
LinkNode *pDeletedNode=NULL;
if((*pHead)->value==value) //头节点
{
pDeletedNode = *pHead;
*pHead = (*pHead)->next;
}
else
{
LinkNode *pNode = *pHead;
while(pNode->next!=NULL && pNode->next->value!=value) //找到符合查找值的前一个节点
pNode = pNode->next;
if(pNode->next!=NULL && pNode->next->value==value) //找到
{
pDeletedNode = pNode->next;
pNode->next = pNode->next->next;
}
if(pDeletedNode!=NULL) //删除节点
{
delete pDeletedNode;
pDeletedNode = NULL;
}
}
}
2. 逆序输出单链表的节点值(使用栈)
void reverse_print(LinkNode *pHead)
{
stack<LinkNode*> s;
LinkNode *pNode = pHead;
while(pNode)
{
s.push(pNode);
pNode = pNode->next;
}
while(!s.empty())
{
pNode = s.top();
cout << pNode->value << " ";
s.pop();
}
cout << endl;
}
void recur_print(LinkNode *pHead) //该方法改变了链表原有的结构,且链表长度不能太长
{
if(pHead->next!=NULL)
recur_print(pHead->next);
cout << pHead->value << " ";
}
3 单链表逆转
void reverse_list(LinkNode **pHead) //逆转单链表
{
LinkNode *cur = *pHead; //指向当前节点
LinkNode *pre= NULL; //指向前一个节点
LinkNode *temp = NULL; //临时指针
while(cur) //当cur==NULL停止遍历
{
temp = pre;
pre = cur;
cur = cur->next;
pre->next = temp;
}
*pHead = pre; //将头指针指向最后一个节点
}
4 约瑟夫环问题(使用循环单链表实现)
void Joseph(LinkNode **pHead, int k)
{
int cnt=1;
LinkNode *pNode = *pHead;
LinkNode *tmp = NULL, *dNode = NULL;
while(pNode->next!=pNode) //最后一个节点,则停止
{
while(cnt!=k)
{
cnt++;
tmp = pNode;
pNode = pNode->next;
}
if(cnt==k) //第k个节点
{
dNode = pNode;
tmp->next = pNode->next;
pNode = pNode->next;
cout << dNode->value << " ";
delete dNode; //删除节点
dNode = NULL;
cnt=1;
}
}
cout << pNode->value << " "; //输出最后一个节点值
cout << endl;
}
其中循环单链表实现及基本操作如下:
struct LinkNode
{
int value;
LinkNode *next;
};
//往循环单链表中插入节点
void AddToTail(LinkNode **pHead, int value) //尾插法插入节点
{
LinkNode *pNew = new LinkNode(); //开辟空间用来存储节点值
pNew->value = value;
pNew->next = NULL;
if(*pHead == NULL)
{
*pHead = pNew;
}
else
{
LinkNode *pNode = *pHead;
while(pNode->next!=*pHead) //找到最后一个节点
pNode = pNode->next;
pNode->next = pNew; //插入节点
}
pNew->next = *pHead;
}
//输出循环单链表中的节点值
void PrintList(LinkNode *pHead) //输出链表中的节点值
{
LinkNode *pNode = pHead->next;
cout << pHead->value <<" "; //打印第一个节点值
while(pNode!=pHead)
{
cout << pNode->value << " ";
pNode = pNode->next;
}
cout << endl;
}
//删除节点值
void RemoveNode(LinkNode **pHead, int value) //从链表中删除节点
{
if(pHead==NULL || *pHead==NULL)
return;
LinkNode *pDeletedNode=NULL;
if((*pHead)->value==value) //头节点
{
pDeletedNode = *pHead;
*pHead = (*pHead)->next;
}
else
{
LinkNode *pNode = *pHead;
while(pNode->next!=NULL && pNode->next->value!=value) //找到符合查找值的前一个节点
pNode = pNode->next;
if(pNode->next!=NULL && pNode->next->value==value) //找到
{
pDeletedNode = pNode->next;
pNode->next = pNode->next->next;
}
if(pDeletedNode!=NULL) //删除节点
{
delete pDeletedNode;
pDeletedNode = NULL;
}
}
}