本博文内容:简历单链表,删除节点,输出节点
逆序输出单链表节点值
单链表逆转
输出单链表的倒数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; } } }