面试中常考的单链表处理

#include<stdio.h>

#include<stdlib.h>

#include<assert.h>



struct node

{

	int data;

	struct node *next;

}linknode;



typedef struct node * LinkNode;

LinkNode head = NULL;



LinkNode createNode(int data)

{

	LinkNode node = NULL;

	node = (LinkNode)malloc(sizeof(linknode));

	node->data = data;

	node->next = NULL;

	return node;

}

//在insert函数中返回head后head的值就不会为空,而不返回head时就返回空

LinkNode insert(LinkNode head, int data)

{

	if(head == NULL)

	{

		head = createNode(data);

		return head;

	}

	LinkNode node = NULL;

	node = createNode(data);

	node->data = data;

	node->next = head->next;

	head->next = node;

	return head;

}



void traverse(LinkNode head)

{

	LinkNode p = NULL;

	p = head;

	while( NULL != p)

	{

		printf("%d ", p->data);

		p = p->next;

	}

}



void linkListFree(LinkNode head)

{

	assert(head != NULL);

	LinkNode p = head;

	LinkNode q;

	while( NULL != p)

	{

		q = p->next;

		free(p);

		p = NULL;

		p = q;

	}

}



LinkNode reverse(LinkNode head)

{

	assert(head != NULL);

	LinkNode ptr = createNode(-1);

	ptr->next = head;

	LinkNode p = head->next;

	head->next = NULL;//必须对head->next置空,不然出现循环

	LinkNode q = NULL;

	while(p != NULL)

	{

		q = p->next;

		p->next = ptr->next;

		ptr->next = p;

		p = q;

	}

	return ptr->next;

}



//无头单链表删除节点

void deleteRandomNode(LinkNode p)

{

	assert(p != NULL);

	LinkNode n = p->next;

	if(n != NULL)

	{

		p->data = n->data;

		p->next = n->next;

		free(n);

		n = NULL;

	}

}



//判断两个链表是否相交

bool isIntersect(LinkNode headone, LinkNode headtwo)

{

	assert( (headone!=NULL) && (headtwo!=NULL) );

	LinkNode p = headone;

	while(p->next != NULL)

	{

		p = p->next;

	}

	LinkNode q = headtwo;

	while( (NULL != q) && (q != p) )

	{

		q = q->next;

	}

	if(q == NULL)

		return false;

	return true;

}





//如果相交找到相交的第一个节点

LinkNode firstIntersectNode(LinkNode headone, LinkNode headtwo)

{

	assert( (NULL != headone) && (NULL != headtwo) );

	int lenone = 0, lentwo = 0;

	LinkNode p = headone;

	while(NULL != p)

	{

		lenone++;

		p = p->next;

	}

	p = headtwo;

	while(NULL != p)

	{

		lentwo++;

		p = p->next;

	}

	if(lenone < lentwo)

	{

		p = headtwo;

		for(int i=0; i<(lentwo-lenone); i++)

		{

			p = p->next;

		}

		LinkNode q = headone;

		while( (NULL != p) && (NULL != q) )

		{

			if(p == q)

				return p;

			else

			{

				p = p->next;

				q = q->next;

			}

		}

	}

	else if(lenone > lentwo)

	{

		p = headone;

		for(int i=0; i<(lenone-lentwo); i++)

		{

			p = p->next;

		}

		LinkNode q = headtwo;

		while( (NULL != p) && (NULL != q) )

		{

			if(p == q)

				return p;

			else

			{

				p = p->next;

				q = q->next;

			}

		}

	}

	else

	{

		p = headone;

		LinkNode q = headtwo;

		while( (NULL != p) && (NULL != q) )

		{

			if(p == q)

				return p;

			else

			{

				p = p->next;

				q = q->next;

			}

		}

	}

}





LinkNode createLinkList(int n)

{

	LinkNode h = NULL;

	for(int i=0; i<n; i++)

		h = insert(h, i+1);

	return h;

}



void test()

{

	head = createLinkList(10);

	traverse(head);

	printf("\n");

	LinkNode h = reverse(head);

	LinkNode p = h;

	traverse(h);

}



int main()

{

	test();

	return 0;

}


你可能感兴趣的:(单链表)