链表(未完待续)

#include <iostream>
#include <stdlib.h>
#include <vector>
#include <set>
#include <stack>
#include <algorithm>
#include <string>
#include <sstream>
 using namespace std;
 struct ListNode
 {
	 int m_nValue;
	 ListNode*m_pNext;
 };
 //创建一个链表结点
 ListNode* CreateListNode(int value)
 {
	 ListNode* pNode=new ListNode();
	 pNode->m_nValue=value;
	 pNode->m_pNext=NULL;
	 return pNode;
 }
 //在链表尾部添加结点 
 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;
	 }
 }

 ListNode * CreateLink(int a[],int k)  
 {  
	 ListNode * Head=NULL,*q=NULL;  
	 for(int i=0;i<k;i++)  
	 {  
		 ListNode * pNew=new ListNode();  
		 pNew->m_nValue=a[i];  
		 pNew->m_pNext=NULL;  

		 if(Head==NULL)  
		 {  
			 Head=pNew;  
			 q=pNew;  
		 }  
		 else  
		 {  
			 q->m_pNext=pNew;  
			 q=q->m_pNext;  
		 }  
	 }  
	 return Head;  
 }  
 //从头到尾输出链表
 void printLink(ListNode* pHead)
 {
	 ListNode* p=pHead;
	 while (p)
	 {
		 cout<<p->m_nValue<<" ";
		 p=p->m_pNext;
	 }
	 cout<<endl;
 }
 //从尾到头输出链表
 void PrintListReverse(ListNode* pHead)
 {
	 //利用栈的先进后出机制
	 stack<ListNode*>nodes;
	 ListNode* pNode=pHead;
	 while (pNode!=NULL)
	 {
		 nodes.push(pNode);
		 pNode=pNode->m_pNext;
	 }
	while(!nodes.empty())
	 {
		 pNode=nodes.top();
		 cout<<pNode->m_nValue<<" ";
		 nodes.pop();
	 }
 }

 //翻转链表
//还未搞透,以后重点复习
 ListNode * ReverseList(ListNode *head)
 {
	 ListNode *p1,*p2,*p3;
	 if(head==NULL)
		 return head;
	 p1=head;
	 p2=p1->m_pNext;
	 while(p2)        
	 {
		 p3=p2->m_pNext;	      //要改变p2->m_pNext的指针,所以必须先保留p2->m_pNext	     
		 p2->m_pNext=p1;
		 p1=p2;		      //循环往后
		 p2=p3;
	 }
	 head->m_pNext=NULL;   //原先的head已经变成tail,别忘了置空,只有到这步才能置空
	 head=p1;
	 return head;
 }

 //删除链表中第一个含有value的值
 void RemoveNode(ListNode**pHead,int value)
 {
	 //假如链表为空则退出
    if(pHead==NULL||*pHead==NULL) return;
	//初始化
	ListNode* pToBeDeleted=NULL;
	//需要删除的值为表头时
	if ((*pHead)->m_nValue==value)
	{
		pToBeDeleted=*pHead;
		*pHead=(*pHead)->m_pNext;
	}
	else
	{
		//中间变量pNode
		ListNode* pNode=*pHead;
		//如果pNode不为删除数则遍历
		while (pNode->m_pNext!=NULL&& pNode->m_pNext->m_nValue!=value)
		{
			pNode=pNode->m_pNext;
		}
		//
		if (pNode->m_pNext!=NULL && pNode->m_pNext->m_nValue==value)
		{
			/*pToBeDeleted=pNode->m_pNext;*/
			pNode->m_pNext=pNode->m_pNext->m_pNext;
		}
	/*	if (pToBeDeleted!=NULL)
		{
			delete pToBeDeleted;
			pToBeDeleted=NULL;
		}*/
	}
 }
 //删除指定结点指针
 void DeleteNode(ListNode**pListHead, ListNode* pToBeDeleted)
 {
	 if(!pToBeDeleted||!pListHead) return;
	 //删除的结点不是尾结点
	 if (pToBeDeleted->m_pNext!=NULL)
	 {
		 ListNode* pNext= pToBeDeleted->m_pNext;
		 pToBeDeleted->m_nValue=pNext->m_nValue;
		 pToBeDeleted->m_pNext=pNext->m_pNext;

		 delete pNext;
		 pNext=NULL;
	 }
	 //链表中只有一个结点
	 else if(*pListHead==pToBeDeleted)
	 {
		 delete pToBeDeleted;
		 pToBeDeleted=NULL;
		 *pListHead=NULL;
	 }
	 //删除的结点为尾节点,则从前往后遍历
	 else
	 {
		 ListNode* pNode=*pListHead;

		 while (pNode->m_pNext!=pToBeDeleted)
		 {
			 pNode=pNode->m_pNext;
		 }
		 pNode->m_pNext=NULL;
		 delete pToBeDeleted;
		 pToBeDeleted=NULL;
	 }
 }

 //合并两个排序的链表
 ListNode* Merge(ListNode* pHead1,ListNode* pHead2)
 {
	 if(pHead1==NULL) return pHead2;
	 if(pHead2==NULL) return pHead1;

	 ListNode* pMergedHead=NULL;
	 if (pHead1->m_nValue<pHead2->m_nValue)
	 {
		 pMergedHead=pHead1;
		 pMergedHead->m_pNext=Merge(pHead1->m_pNext,pHead2);
	 }
	 else
	 {
		 pMergedHead=pHead2;
		 pMergedHead->m_pNext=Merge(pHead1,pHead2->m_pNext);
	 }
	 return pMergedHead;
 }
 //找到倒数第K个结点
 ListNode* FindKthToTail(ListNode* pListHead,unsigned int k)
 {
	 if(pListHead==NULL||k<=0) return NULL;
	 ListNode *pAhead=pListHead;
	 ListNode *pBehead=pListHead;
	 for (int i=0;i<k-1;++i)
	 {
		 if(pAhead->m_pNext!=NULL)
			 pAhead=pAhead->m_pNext;
		 else
		     return NULL;
	 }
	 //pBehead=pListHead;
	 while (pAhead->m_pNext!=NULL)
	 {
		 pAhead=pAhead->m_pNext;
		 pBehead=pBehead->m_pNext;
	 }
	 return pBehead;
 }
 int main()
 {
	 int a[]={1,3,5,7},b[]={2,4,6,8};
	 //创建链表
	 ListNode* Head=CreateLink(a,4);
	 ListNode* Head1=CreateLink(b,4);
	 //打印链表
	 printLink(Head);
	 //尾部加值
	 //AddToTail(&Head,6);
	 //在链表中加入值
	 //RemoveNode(&Head,3);
    // printLink(Head);
	 //删除结点
	/* ListNode* pNode=Head->m_pNext;
	 DeleteNode(&Head, pNode);
	 printLink(Head);*/
	 //从尾到头输出链表
	 //PrintListReverse(Head);
	 //找到链表的倒数i个结点
	//printLink( FindKthToTail(Head,2));
	 //反转链表
	// printLink(ReverseList(Head));
	 //合并有序链表
	 printLink(Merge(Head,Head1));

	 system("pause");
	 return 0;
 }


 

  

原文地址:https://www.cnblogs.com/zhaodun/p/6929633.html