0.数据结构

typedef struct LNode{//链表结点
	int data;
	struct LNode* next;
}LNode,*Linklist;

1.头插

Linklist headInsert(Linklist &L){
	L = new LNode();
	LNode *s;//插入结点
	int x;
	s = (Linklist)malloc(sizrof(LNode));
	s->data = x;
	s->next = L->next;
	L->next = s;
	return L;
}

2.尾插

Linklist tailInsert(Linklist &L){
	L = new LNode();
	LNode *r = L;//尾指针
	int x;
	scanf("%d",x);
	while(x != NULL){
		s = (Linklist)malloc(sizrof(LNode));
		s->data = x;
		r->next = s;
		r = s;
		scnaf("%d",x);
	}
	return L;
}

3.原地逆置(重要)

LinkList Reverse(Linklist &L){
	LNode *p = L->next;
	LNode *s = p;//头插防断链
	L->next = NULL;//L置空
	while(p != NULL){
		s = p->next;
		p->next = L->next;
		L->next = p;
		p = s
	}
	return L;
}

4.无序单链表,删除介于s和t之间的所有元素

LinkList delete_st(Linklist &L,int s,int t){
	LNode *p = L->next;
	LNode *pre= L;//指向p的前驱
	while(p != NULL){
		if(p->data>=s && p->data<=t){//需要删除
			pre->next = p->next;
			free(p);
			p = pre->next;
		}
		else{
			pre = p;
			p = p->next;
		}
	}//while end
	return L;
}

5.找出两个单链表的公共结点

int length(Linklist L){
	int l = 0;
	LNode *p = L->next;
	while(p != NULL){
		p = p->next;
		l++;
	}
	return L;
}
LNode* same_Node(Linklist &L1,Linklist &L2){
	int l1 = length(L1);
	int l2 = length(l2);
	int k = 0;//长度之差
	LNode *p = L1->next;
	LNode *q = L2->next;
	if(l1 > l2){
		k = l1 - l2;
		while(--k)
			p = p->next;
	}
	else{
		k = l2 - l1;
		while(--k)
			q = q->next;	
	}
	while(p != q){
		p = p->next;
		q = q->next;
	}
	return p;
}

6.将链表A分成A和B,A中保存原链表序号为奇数的结点,B中保存原链表中序号为偶数的结点,且保持相对顺序不变

void divide(Linklist &A){
	Linklist B = (LNode*)malloc(sizeof(LNode));
	B->next = NULL;
	LNode *p = A->next;
	LNode *q = p->next;
	LNode *r = B;
	while(q != NULL){
		p = q->next;
		q->next = r->next;
		r->next = q;
		r = q;
		q = p->next;
	}
	return ;
}

//法2:p保存原表第一个节点后,原表置空,之后奇数插A,偶数插B;

void divide(Linklist &A){
	LinkList B = (LNode*)malloc(sizeof(LNode));
	LNode *p = A->next;
	A->next = NULL;
	LNode *ra = A;
	LNode *rb = B;
	int i = 1;//标记当前序号是奇数还是偶数
	while(p != NULL){
		if(i % 2 != 0){
			ra->next = p;
			ra = p;
			p = p->next;
			i++;
		}
		else{
			rb->next = p;
			rb = p;
			p = p->next;
			i++;
		}
	}
	ra->next = NULL;
	rb->next = NULL;
	return ;
}

7.将线性表C={a1,b1,a2,b2…an,bn}就地拆成A = {a1,a2…an},B = {bn…b2,b1}

void divide(Linklist &C){
	Linklist A = (Linklist)malloc(sizeof(LNode));
	Linklist B = (Linklist)malloc(sizeof(LNode));
	LNode*p = C->next;
	LNode*r = A;//A的尾指针
	LNode*h = B;//B的头指针
	LNode *s;//头插防止断链
	int i = 0;//标记当前结点是A的还是B的
	while(p!=NULL){
		if(i % 2 != 0){//当前结点尾插到A
			r->next = p;
			r = p;
			p = p->next;
		}
		else{
			s = p->next;
			p->next = h->next;
			h->next = p;
			p = s;
		}
	}
	r->next = NULL;
}

8.删除单链表中数值相同的元素