LeetCode-39. 组合总和

python3.7 pip pip3

  返回  

习题11-7 奇数值结点链表 (20 分) (带注释)

2021/8/21 10:14:54 浏览:

本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中奇数值的结点重新组成一个新的链表。链表结点定义如下:

struct ListNode {
    int data;
    ListNode *next;
};

函数接口定义:

struct ListNode *readlist();
struct ListNode *getodd( struct ListNode **L );

函数readlist从标准输入读入一系列正整数,按照读入顺序建立单链表。当读到−1时表示输入结束,函数应返回指向单链表头结点的指针。

函数getodd将单链表L中奇数值的结点分离出来,重新组成一个新的链表。返回指向新链表头结点的指针,同时将L中存储的地址改为删除了奇数值结点后的链表的头结点地址(所以要传入L的指针)。

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>

struct ListNode {
    int data;
    struct ListNode *next;
};

struct ListNode *readlist();
struct ListNode *getodd( struct ListNode **L );
void printlist( struct ListNode *L )
{
     struct ListNode *p = L;
     while (p) {
           printf("%d ", p->data);
           p = p->next;
     }
     printf("\n");
}

int main()
{
    struct ListNode *L, *Odd;
    L = readlist();
    Odd = getodd(&L);
    printlist(Odd);
    printlist(L);

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

1 2 2 3 4 5 6 7 -1

输出样例:

1 3 5 7 
2 2 4 6 

参考代码

struct ListNode *readlist()
{
	// 创建一个头结点(带头结点的链表更加易于操作) 
	struct ListNode *head = (struct ListNode *)malloc(sizeof(struct ListNode));
	head->data = 0;
	head->next = NULL;
	
	// 创建一个尾指针(尾指针便于在表尾插入结点 ) 
	struct ListNode *tail = head; 
	
	// read data
	int value;
	scanf("%d", &value);
	while (value != -1) {
		struct ListNode *p = (struct ListNode *)malloc(sizeof(struct ListNode));
		p->data = value;
		p->next = NULL;
		tail->next = p;
		tail = p;
		scanf("%d", &value);
	}
	
	// 返回头结点后面的那个结点(第一个结点)
	return head->next; 
}

struct ListNode *getodd( struct ListNode **L ) {
	// 创建一个头结点(带头结点的链表更加易于操作) 
	struct ListNode *head = (struct ListNode *)malloc(sizeof(struct ListNode));
	head->data = 0;
	head->next = NULL;
	
	// 创建一个尾指针(尾指针便于在表尾插入结点 ) 
	struct ListNode *tail = head;
	
	// 遍历链表*L,删除值为奇数的结点,pre->next = now->next 
	struct ListNode *now = *L;
	struct ListNode *pre = (struct ListNode *)malloc(sizeof(struct ListNode));
	pre->data = 0;
	pre->next = now;
	int flag = 1;
	while (now) {
		if (now->data % 2 != 0) {
			pre->next = now->next;
			// 把now插入到odd 
			tail->next = now;
			tail = now;
		} else {
			pre = now;
			if (flag) { // 记录第一个值为偶数的结点的地址 
				*L = now;
				flag = 0;
			}
		}
		now = now->next;
	}
	// 如果*L只有奇数,那么*L将成为一个空链表 
	if (flag) *L = NULL;
	
	// 把odd最后一个结点处理好 
	tail->next = NULL;
	
	// 返回头结点后面的那个结点(第一个结点)
	return head->next;
}

联系我们

如果您对我们的服务有兴趣,请及时和我们联系!

服务热线:18288888888
座机:18288888888
传真:
邮箱:888888@qq.com
地址:郑州市文化路红专路93号