问题10:还是单链表的一些问题(如单链表,怎样只遍历一次就可以求出中间结点)
来源:互联网 发布:腾讯算法工程师待遇 编辑:程序博客网 时间:2024/05/16 15:56
问题描述:
给出一个单链表,不知道结点N的值,怎样只遍历一次就可以求出中间结点?
/* *该题的大致思路是设置两个指针,比如*p1,*p2。p2每次移动两个位置,而p1每次移动一个位置。当p2移动到最后时,p1就是中间结点了。 */node *searchMid(node *head){ if(NULL == head) return head; if(NULL == head->next) return head->next; node *p1, *p2; P1 = P2 = head; while(p2->next!= NULL) { /*p2结点移动2个结点位置*/ P2 = P2->next; if(p2->next != NULL) p2 = p2->next; p1 = p1->next; } return p1;}
单链表插入结点
关于单链表插入结点,大体要注意三种情况:
一是在第一个结点前插入;
二是在链表的中间插入;
三是在链表的最后插入。
另外还需要注意单链表没有指向前驱结点的指针,所以在实际程序中往往需要记录前驱结点,相信只要知道了这几点写出相应的代码就不太困难了。
代码如下:
#include <stdio.h>#include <malloc.h>typedef struct student{ int data; struct student *next;}node;//创建链表node *creat(){ node *head, *p, *s; int x, cycle = 1; head = (node *)malloc(sizeof(node)); p = head; while(cycle) { printf("\nplease enter the data:"); scanf("%d", &x); if(x != 0) { s = (node *)malloc(sizeof(node)); s->data = x; printf("\n%d", s->data); p->next = s; p = s; } else cycle = 0; } head = head->next; printf("\nThe value of the first node is:%d\n", head->data); p->next = NULL; return head;}//单链表插入结点node *insert_to_list(node *head, int num){ node *cur, *pre, *s; cur = head; s = (node *)malloc(sizeof(node)); s->data = num; while(s->data > cur->data && cur->next != NULL) { pre = cur; cur = cur->next; } if(s->data <= cur->data) { if(cur == head) { s->next = head; head = s; } else { s->next = cur; pre->next = s; } } else { cur->next = s; s->next = NULL; } return head;}//单链表测长 int length(node *head) { int len = 0; node *p = head; while(p != NULL) { len++; p = p->next; } return len; } //单链表打印 void print(node *head) { node *p = head; int n = length(head); printf("\nNow, These %d records are:\n", n); while(p != NULL) { printf("\n uuu %d ", p->data); p = p->next; } }int main(void){ //creat a list node *List = creat(); print(List); node *p = insert_to_list(List, 5); print(p); return 0;}
运行结果:
编程实现单链表的逆置
代码如下:
#include <stdio.h>#include <malloc.h>typedef struct student{ int data; struct student *next;}node;//创建链表node *creat(){ node *head, *p, *s; int x, cycle = 1; head = (node *)malloc(sizeof(node)); p = head; while(cycle) { printf("\nplease enter the data:"); scanf("%d", &x); if(x != 0) { s = (node *)malloc(sizeof(node)); s->data = x; printf("\n%d", s->data); p->next = s; p = s; } else cycle = 0; } head = head->next; printf("\nThe value of the first node is:%d\n", head->data); p->next = NULL; return head;}//单链表插入结点node *insert_to_list(node *head, int num){ node *cur, *pre, *s; cur = head; s = (node *)malloc(sizeof(node)); s->data = num; while(s->data > cur->data && cur->next != NULL) { pre = cur; cur = cur->next; } if(s->data <= cur->data) { if(cur == head) { s->next = head; head = s; } else { s->next = cur; pre->next = s; } } else { cur->next = s; s->next = NULL; } return head;}//单链表测长 int length(node *head) { int len = 0; node *p = head; while(p != NULL) { len++; p = p->next; } return len; } //单链表打印 void print(node *head) { node *p = head; int n = length(head); printf("\nNow, These %d records are:\n", n); while(p != NULL) { printf("\n uuu %d ", p->data); p = p->next; } }//实现单链表的逆置node *reverse(node *head){ node *p1, *p2, *p3; if(head == NULL || head->next == NULL) return head; p1 = head; p2 = head->next; while(p2) { p3 = p2->next; p2->next = p1; p1 = p2; p2 = p3; } head->next = NULL; head = p1; return head;}int main(void){ //creat a list node *List = creat(); print(List); node *p = insert_to_list(List, 5); print(p); p = reverse(p); print(p); return 0;}
运行结果:
- 问题10:还是单链表的一些问题(如单链表,怎样只遍历一次就可以求出中间结点)
- 给一个单链表,不知道结点N的值,怎样只遍历一次就可以求出中间结点,写出算法
- 给出一个单链表,不知道N的值,怎样遍历一次就可以求出中间结点
- 给出一个单链表,不知道节点N的值,怎样只遍历一次就可以求出中间节点,写出算法。
- 给出一个单链表,不知道节点N的值,怎样只遍历一次就可以求出中间节点,写出算法!
- 有关单链表的两个问题【遍历一次求中间节点,倒数第K个结点】
- 给出一个单链表如何只遍历一次就找出中间节点(我们并不知道单链表的长度N)
- 只遍历链表一次求链表中间结点
- 只遍历一次单链表,确定单链表中间节点的位置
- 只遍历一次单链表找出中间节点的算法
- 一个链表只遍历一次求出中间的节点
- C++实现遍历链表一次求出中间的节点
- 笔试面试,单链表相关(3)遍历一次找中间结点、倒数第K个结点
- 删除单链表的头元素;单链表,只是遍历一次,求出中间节点
- 带头结点的单链表( 冒泡排序 一次遍历求中间结点的值) 链表 就地反转 倒数第k个结点
- 遍历单链表一次,找出链表中间结点
- 【数据结构】单链表—求链表中间节点(只遍历一次链表)— 快慢指针
- 单链表遍历一次求倒数第k个结点和中间结点
- 【D3.js数据可视化系列教程】--(一)简介
- java访问SQLServer2008数据库方式一:jdbc-odbc桥连接
- linux启用触摸板功能
- 如何计算Nand Flash要传入的行地址和列地址
- NSLog的格式
- 问题10:还是单链表的一些问题(如单链表,怎样只遍历一次就可以求出中间结点)
- CUDA编程札记
- webService
- hdu 1151 Air Raid 最小路径覆盖(最大匹配)
- 动态规划--UVa10891
- gui 打字游戏
- ImageView
- AndEngine加载图片资源(五)
- QT 信号和槽 .