链表的基本操作

</pre><p>head代表第一个指针,前面加了一个dummy节点,方面用来处理头指针。</p><p><pre name="code" class="cpp">#include <iostream>
using namespace std;

struct LinkNode{
	int data;
	LinkNode *next;
	LinkNode(int x):data(x),next(NULL){}
};

//创建只有空链表,返回一个dummy节点
LinkNode * createLink()
{
	LinkNode *dummy = new LinkNode(-1);
	return dummy;
}

LinkNode * initLink(LinkNode *dummy)
{
	//用一个数组初始化链表
	int array[] = {1,2,3,4,5,6};

	LinkNode *tmp,*head;
	tmp = dummy;
	//使用的是尾插入法
	for(int i=0;i<sizeof(array)/sizeof(int);i++)
	{
		LinkNode *p = new LinkNode(array[i]);
		tmp->next=p;
		tmp = tmp->next;
	}
	head = dummy->next;
	delete dummy;
	return head;	
}

//显示链表
void showList(LinkNode *head)
{
	while(head)
	{
		printf("%d ",head->data);
		head = head->next;
	}
	printf("\n");
	return;
}

//找值为x的前驱
LinkNode * findPrevious(LinkNode *head,int x)
{
	if(head->data == x)
		return NULL;
	LinkNode *p = head;
	while(p->next != NULL && p->next->data != x)
		p = p->next;

	if(p->next == NULL)
		return NULL;
	else
		return p;
}

//在某个节点后,增加一个新的节点
void addNewNodeAfter(LinkNode *insertPos,int x)
{
	LinkNode *p = new LinkNode(x);
	p->next = insertPos->next;
	insertPos->next = p;
	return;
}

//在某个节点insertPos前插入一个新的节点
LinkNode* addNewNodeBefore(LinkNode *head,int insertPos,int x)
{
	LinkNode *dummy = new LinkNode(-1);
	dummy->next = head;
	LinkNode *pre = dummy;
	while(pre->next!=NULL && pre->next->data!=insertPos)
		pre = pre->next;
	if(pre->next == NULL)//找不到insertPos对应的节点
		return head;
	LinkNode *p = new LinkNode(x);
	p->next = pre->next;
	pre->next = p;
	head = dummy->next;
	delete dummy;
	return head;
}

//在第K个元素之前,增加一个新的节点
LinkNode * insertKthNode(LinkNode *head,int k,int x)
{
	LinkNode *dummy = new LinkNode(-1);
	dummy->next = head;
	LinkNode *pre = dummy;

	//找到前驱元素.需要移动k-1次
	for(int i=1;pre->next !=NULL && i<k;i++)
		pre = pre->next;

	if(pre->next == NULL)//k超过了链表的长度
		return head;
	
	LinkNode *p = new LinkNode(x);
	p->next = pre->next;
	pre->next = p;
	head = dummy->next;
	delete dummy;
	return head;
}

//删除值为x的节点,用dummy节点
LinkNode * deleteNode(LinkNode *head,int x)
{
	LinkNode *dummy = new LinkNode(-1);
	dummy->next = head;
	LinkNode *pre = dummy;

	//找到被删除节点的前驱
	while(pre->next != NULL && pre->next->data != x)
		pre = pre->next;
	if(pre->next == NULL) //找不到x对应的节点
		return head;
	LinkNode *cur = pre->next;
	pre->next = cur->next;
	delete cur;
	head = dummy->next;
	delete dummy;
	return head;
}

//删除值为x的节点,不用dummy节点
LinkNode* deleteNode2(LinkNode *head,int x)
{
	if(head->data == x)
	{
		//如果是头结点,新增一个dummy节点
		LinkNode *dummy = new LinkNode(-1);
		dummy->next = head;
		LinkNode *newHead = head->next;
		dummy->next = newHead;
		delete head;
		return newHead;
	}

	//找到x的前驱
	LinkNode *pre = findPrevious(head,x);
	if(NULL == pre) return head;
	LinkNode *p = pre->next;
	pre->next = p->next;
	delete p;
	return head;
}

//reverse 一个链表
LinkNode *reverse(LinkNode *head)
{
	LinkNode *pre = NULL;
	while(head)
	{
		LinkNode *tmp = head->next;
		head->next = pre;
		pre = head;
		head = tmp;			
	}
	return pre;
}

//摧毁链表
void desroyList(LinkNode *head)
{
	while(head)
	{
		LinkNode *tmp = head->next;
		delete head;
		head = tmp;		
	}
	return;
}

void main()
{
	//创建一个空链表
	LinkNode *dummy = createLink();
	//对链表初始化,返回head
	LinkNode *head = initLink(dummy);
	//显示链表
	showList(head);
	//找前驱
	LinkNode *p = findPrevious(head,3);
	printf("%d\n",p->data);
	//在某个节点insertPos前插入一个新的节点
	addNewNodeBefore(head,3,100);
	showList(head);
	//在第K个元素前加入一个新的节点
	head = insertKthNode(head,1,101);
	showList(head);
	//删除值为x节点
	head = deleteNode(head,1);
	showList(head);
	//reverse 链表
	LinkNode *head_reverse = reverse(head);
	showList(head_reverse);
	//销毁链表
	desroyList(head_reverse);
}






 
修改前的。
</pre><pre code_snippet_id="601534" snippet_file_name="blog_20150210_1_3771789" name="code" class="cpp">
#include <iostream>
using namespace std;
struct Node
{
	int data;
	struct Node *Next;
};


//创建只有头结点的空链表
struct Node * createList()
{
	struct Node * head = NULL;
	head = (struct Node*)malloc(sizeof(struct Node));
	if(NULL == head)
	{
		printf("Create fail!\n");
		return NULL;
	}
	head->Next = NULL;
	head->data = -1;
	return head;
}

//头插法建立链表
bool insertFromHead(struct Node * head,int x)
{
	struct Node * p = NULL;
	p = (struct Node *)malloc(sizeof(struct Node));
	if (NULL == p)
	{
		printf("Malloc fail!\n");
		return false;
	}
	p->data = x;
	p->Next = head->Next;
	head->Next = p;
	return true;
}

//尾插法建立链表
bool insertFromTail(struct Node * head,int x)
{
	struct Node * tmp = head;
	struct Node * p = NULL;
	p = (struct Node *)malloc(sizeof(struct Node));
	if(NULL == p)
	{
		printf("malloc fail!\n");
		return false;
	}

	//找到目前的最后一个结点,将新元素插到后面
	while(tmp->Next)
		tmp = tmp->Next;
	p->data = x;
	p->Next = NULL;
	tmp->Next = p;
	return true;
}

//增加一个结点,在insertPos后面添加一个结点
bool addNewNodeAfter(struct Node * head,struct Node * insertPos,int x)
{
	struct Node * p = (struct Node *)malloc(sizeof(struct Node));
	if(NULL == p)
	{
		printf("malloc fail\n");
		return false;
	}
	p->Next = insertPos->Next;
	p->data = x;
	insertPos->Next = p;
	return true;
}

//查找含有值为x的前驱p.如果存在多个x的值,我们返回第一个。
struct Node * findPrevious(struct Node * head,int x)
{
	struct Node * p = head;
	while(p->Next!=NULL && p->Next->data!= x)
		p = p->Next;

	if(NULL == p->Next)
	{
		printf("The value %d is not exist in this list!\n",x);
		return NULL;
	}
	else
	        return p;
}

//在对应元素insertPos的前面,增加一个结点
bool insertNewNodeBefore(struct Node * head,int insertPos,int x)
{
	struct Node * pre = findPrevious(head,insertPos);
	if (NULL == pre)
	{
		printf("No record find!");
		return false;
	}

	struct Node *p = (struct Node *)malloc(sizeof(struct Node));
	if (NULL == p)
	{
		printf("malloc failed!");
		return false;
	}

	p->Next = pre->Next;
	p->data = x;
	pre->Next = p;
	return true;
}

//在第k个元素之前,增加一个结点
void insertNodeKth(struct Node * head,int k,int x)
{
	struct Node *pre = head;
	for(int i = 1;pre->Next!=NULL && i < k;i++)
		pre = pre->Next;//找到前驱结点

	struct Node *p = (struct Node *)malloc(sizeof(struct Node));
	if(NULL==p)
	{
		printf("malloc failed");
		return;
	}

	p->Next = pre->Next;
	p->data = x;
	pre->Next = p;
	return;
}

//在第K个元素后面,插入一个值
void insertKthAfter(struct Node *head,int k,int x)
{
	struct Node *cur = head->Next;
	for(int i = 1;cur->Next!=NULL && i < k;i++)
		cur=cur->Next;

	struct Node *p = (struct Node *)malloc(sizeof(struct Node));
	if(NULL==p)
	{
		printf("malloc failed");
		return;
	}

	p->Next = cur->Next;
	p->data = x;
	cur->Next = p;
}

//删除值为x的结点
void deleteNode(struct Node * head,int x)
{
	struct Node *pre = findPrevious(head,x);
	if (NULL == pre)
	     return;

	struct Node *p = pre->Next;
	pre->Next = p->Next;
	free(p);
	return;
}

//reversse.遍历原来的链表节点,用头插法重新生成一个新的链表
struct Node * generateRerverse(struct Node *head)
{
	struct Node *head_reverse,*tmp,*p;
	head_reverse = (struct Node *)malloc((sizeof(struct Node)));
	if(NULL == head_reverse)
	{
		printf("Malloc fail\n");
		return NULL;
	}
	head_reverse->Next = NULL;
	head_reverse->data = 0;

	tmp = head->Next;
	while(tmp!=NULL)
	{
		p = (struct Node *)malloc(sizeof(struct Node));
		if(NULL == p)
		{
			printf("Malooc fail\n");
			return NULL;
		}
		p->data = tmp->data;
		p->Next = head_reverse->Next;
		head_reverse->Next = p;		
		tmp = tmp->Next;
	}
	return head_reverse;
}

//将这个链表翻转,不产生新的链表
struct Node * reverseCurLinkList(struct Node *head)
{
	struct Node *first,*last,*cur,*post,*tmp;
	cur = head->Next;
	post = cur->Next;
	first = cur;
	while(post!=NULL)
	{
		tmp = post->Next;
		post->Next = cur;//将cur和post的指向翻转
		cur = post;//cur和post分别向后移动一个
		post = tmp;
	}
	last = cur;
	first->Next = NULL;//原来第一个节点,现在在末尾
	head->Next = last;//原来最后一个节点,现在位于第一个
	return head;
}

//显示链表
bool showList(struct Node * head)
{
	struct Node * tmp = head->Next;
	if(NULL == tmp)
		printf("The list is NULL");
	while(tmp)
	{
		printf("%d ",tmp->data);
		tmp = tmp->Next;
	}
	printf("\n");
	return true;
}

//摧毁链表
void deleteList(struct Node * head)
{
	struct Node *p,*tmp;
	p = head->Next;
	head->Next = NULL;
	while(p)
	{
		tmp = p->Next;
		free(p);
		p=tmp;
	}
}


void main()
{
	struct Node * pre = NULL;
	struct Node * head = createList();
	if(NULL == head)
	{
		printf("create list fail!\n");
		return;
	}
	//insertFromHead(head,1);
	//insertFromHead(head,2);
	//insertFromHead(head,3);

	insertFromTail(head,1);
	insertFromTail(head,2);
	insertFromTail(head,3);
	insertFromTail(head,4);
	insertFromTail(head,5);
	showList(head);

	//查找前驱
	//pre = findPrevious(head,3);
	//if (pre!=NULL)
		//printf("The pre value is: %d\n",pre->data);

	//在元素i前面,增加一个元素
	//insertNewNodeBefore(head,5,10);
	//showList(head);

	//在第k个元素前,增加一个元素
	//insertNodeKth(head,1,100);
	//showList(head);

	//在第K个元素后面,增加一个元素
	//insertKthAfter(head,1,99);
	//showList(head);

	//产生一个全新的翻转链表
	//struct Node *head_reverse = generateRerverse(head);
	//showList(head_reverse);

	//将当前的链表翻转,不产生新的链表
	head = reverseCurLinkList(head);
	showList(head);

	//删除值为x的结点
	//deleteNode(head,100);
	//showList(head);

	//销毁List
	//deleteList(head);
	//showList(head);
	return;
}



                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值