实现反转单向链表和双向链表的函数。
如 1->2->3 反转后变成 3->2->1。
第一行一个整数 n,表示单链表的长度。
第二行 n 个整数 val 表示单链表的各个节点。
第三行一个整数 m,表示双链表的长度。
第四行 m 个整数 val 表示双链表的各个节点。
在给定的函数内返回相应链表的头指针。
3 1 2 3 4 1 2 3 4
3 2 1 4 3 2 1
/* 仅实现单链表反转 */ #include <stdio.h> #include <stdlib.h> typedef struct node { int val; struct node *next; } Node; Node *newNode(int val); void freeList(Node *head); void printList(Node *head); Node *createList(int n); Node *reverseList(Node *head); int main(void) { int n; Node *head = NULL; scanf("%d", &n); head = createList(n); head = reverseList(head); printList(head); freeList(head); scanf("%d", &n); head = createList(n); head = reverseList(head); printList(head); freeList(head); return 0; } Node *newNode(int val) { Node *node = (Node *) malloc(sizeof(Node)); node->val = val; node->next = NULL; return node; } void freeList(Node *head) { Node *old; while (head != NULL) { old = head; head = head->next; free(old); } } void printList(Node *head) { Node *cur = head; while (cur != NULL) { printf("%d", cur->val); cur = cur->next; if (cur != NULL) printf(" "); } printf("\n"); } Node *createList(int n) { Node *head = NULL, *cur = NULL, *node; int val; for (int i = 0; i < n; i++) { scanf("%d", &val); node = newNode(val); if (head == NULL) { head = node; cur = node; continue; } cur->next = node; cur = cur->next; } return head; } Node *reverseList(Node *head) { Node *next, *pre = NULL; while (head != NULL) { next = head->next; head->next = pre; pre = head; head = next; } return pre; }