一、C语言编程LeetCode数据结构题

一、链表

1、两数相加
算法思想:
1、设置两个指针p,q,分别指向两个链表的头结点
2、设置一个临时变量temp,用来记录两个数相加时是否有进位,初始化为0。只要p,q指针不指向空,就循环把两个指针所指向节点的值和temp相加。如果大于9,就让一个临时变量设置为1,并把相加结果减10,把结果赋给两个指针所指向节点的值;如果小于9就直接赋值给两个节点所指向的值。然后p,q指针分别后移一个节点。
3、最后,判断两个链表哪个更长,如果一样长,直接返回其中一个链表。如果不一样长,再判断一次进位,把临时变量加给哪个长的链表所对应节点,返回长的链表的头结点。

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
	struct ListNode *p=l1,*q=l2;
	int temp=0;
	while(p!=NULL&&q!=NULL){
		p->val+=temp;
		temp=0;
		p->val=p->val+q->val;
		if(p->val>9){
			p->val-=10;
			temp++;
		}
		q->val=p->val;
		p=p->next;
		q=q->next;
	}
	if(q==NULL&&p==NULL){
		return l1;
	}
	else if(q==NULL){
		p->val+=temp;
		return l1;
	}
	else{
		q->val+=temp;
		return l2;
	}
}

2、删除链表的倒数第 N 个结点
算法思想:
1、使用双指针的思想,设置头指针p和尾指针q,初始时都指针链表头结点。先让q指针后移n个位置。
2、同时向后移动p,q指针,直到q指针到达最后一个结点,这样p指针就指向了倒数第n个结点,同时设置t指针指向p指针前面一个位置,方便删除操作。
3、把t指针指向p指针的下一个指针,这样就完成了删除操作,返回链表节点。


struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
	if(head->next==NULL){
		return NULL;
	}
	struct ListNode *p=head,*q=head,*t=head;
	while(--n){
		q=q->next;
	}
	while(q->next!=NULL){
		q=q->next;
		t=p;
		p=p->next;
	}
	t->next=p->next;
	return head;
}

3、合并两个有序链表
算法思想:
1、新建一个头指针,作为一个新的有序链表的头结点。设置p,q指针分别指向两个链表的头结点。
2、循环移动p,q指针,直到p,q指针有指向空结点才停止。比较p,q指针所指向结点值的大小,把小的结点加到新的链表后面。
3、判断哪个链表还有剩余结点,直接把这些剩余结点都加到新的链表后面,返回新链表的头指针,。

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
	struct ListNode *p=list1,*q=list2,*r;
	struct ListNode *x = (struct ListNode*)malloc(sizeof(struct ListNode));
	r=x;
	x->next=NULL;
	while(p!=NULL&&q!=NULL){
		if(p->valval){
			r->next=p;
			p=p->next;
		}
		else{
			r->next=q;
			q=q->next;
		}
		r=r->next;
	}
	if(p!=NULL){
		r->next=p;
	}
	else{
		r->next=q;
	}
	return x->next;
}

4、两两交换链表中的节点
算法思想:
1、设置一个哑指针指向头结点,方便后续操作,设置一个移动指针p,哑指针指向p
2、循环判断p的下一个结点和下两个结点是否为空,不为空的话,就交换两个结点的位置,并把移动指针指向交换后的后面那个指针。
3、直到p下一个指针或下两个指针为空,说明交换结束,返回头指针,即哑指针的下一个结点。

struct ListNode* swapPairs(struct ListNode* head){
	struct ListNode *r= (struct ListNode*)malloc(sizeof(struct ListNode));
	r->next = head;
	struct ListNode* p = r;
	    while (p->next != NULL && p->next->next != NULL) {
	        struct ListNode* node1 = p->next;
	        struct ListNode* node2 = p->next->next;
	        p->next = node2;
	        node1->next = node2->next;
	        node2->next = node1;
	        p = node1;
	    }
	    return r->next;
}

5、旋转链表
算法思想:
1、使用双指针的思想,设置p,q指针指向头结点。同时遍历一遍链表,得到链表的长度len
2、因为k如果大于len的值,说明整体重复移动了超过一遍,

你可能感兴趣的:(考研初试准备,c语言,数据结构)