带头结点的单链表和不带头结点的单链表的倒数第K个节点
2017-07-20 19:44
351 查看
//求单链表中的倒数第K个节点 #include<stdio.h> #include<malloc.h> typedef struct _Node { int val; struct _Node* next; }Node,*LinkList; //带头结点的单链表 #if 0 void InitList(LinkList* list) { (*list) = (Node*)malloc(sizeof(Node)); (*list)->next = NULL; } void InsertTail(LinkList list) { int data; scanf("%d", &data); while (data != 0) { Node* node = (Node*)malloc(sizeof(Node)); node->val = data; node->next = NULL; Node* r = list; while (r->next != NULL) { r = r->next; } r->next = node; scanf("%d", &data); } } void Print(LinkList list) { Node* r = list->next; while (r != NULL) { printf("%d ", r->val); r = r->next; } printf("\n"); } Node* FindKNode(LinkList list, int k) { if (list == NULL || k < 1) { return NULL; } Node* p1 = list->next; Node* p2 = list->next; while (k > 1 && p1 != NULL) { k--; p1 = p1->next; } if (p1 == NULL) { return NULL; } while (p1->next != NULL) { p1 = p1->next; p2 = p2->next; } return p2; } int main(void) { LinkList list; InitList(&list); InsertTail(list); Node* k = FindKNode(list, 3); if (k == NULL) { printf("not found\n"); } else { printf("%d\n", k->val); } Print(list); } #endif //不带头结点的单链表 void InitList(LinkList* list) { (*list) = NULL; } void InsertTail(LinkList* list) { int data; scanf("%d", &data); while (data != 0) { Node* node = (Node*)malloc(sizeof(Node)); node->val = data; node->next = NULL; if (*list == NULL) { *list = node; } else { Node* r = *list; while (r->next != NULL) { r = r->next; } r->next = node; } scanf("%d", &data); } } void Print(LinkList list) { Node* r = list; while (r != NULL) { printf("%d ", r->val); r = r->next; } printf("\n"); } Node* FindKNode(LinkList list, int k) { if (list == NULL || k < 1) { return NULL; } Node* p1 = list; Node* p2 = list; while (k > 1 && p1 != NULL) { k--; p1 = p1->next; } if (p1 == NULL) { return NULL; } while (p1->next != NULL) { p1 = p1->next; p2 = p2->next; } return p2; } int main(void) { LinkList list; InitList(&list); InsertTail(&list); Node* k = FindKNode(list, 3); if (k == NULL) { printf("not found\n"); } else { printf("%d\n", 95e9 k->val); } Print(list); }
相关文章推荐
- 带头结点的单链表( 冒泡排序 一次遍历求中间结点的值) 链表 就地反转 倒数第k个结点
- 建立一个带附加头结点的单链表.实现测长/打印/删除结点/插入结点/逆置/查找中间节点/查找倒数第k个节点/判断是否有环
- 链表倒数第k个结点、链表中间节点、链表是否有环
- 剑指offer:链表中倒数第k个结点(java)
- 输入一个链表,输出该链表中倒数第k个结点
- 【剑指offer】14链表中倒数第k个结点
- 25.输出单向链表中倒数第k个结点
- 链表中倒数第k个结点(java版)
- 剑指offer——链表中倒数第k个结点(相关扩展题不错)
- 剑指offer·-链表中倒数第k个结点
- 查找链表中倒数第k个结点
- 2.2链表中倒数第k个结点
- 剑指offer----链表中倒数第K个结点
- 链表中倒数第k个结点
- 剑指Offer-链表中倒数第k个结点
- 剑指offer 15 链表中倒数第k个结点
- 链表的倒数第k个节点
- 华为oj 输出单向链表中倒数第k个结点
- 剑指offer-链表中倒数第K个节点-php
- 求不带头结点的单链表的节点的个数