问题10:还是单链表的一些问题(如单链表,怎样只遍历一次就可以求出中间结点)
2013-09-10 16:14
417 查看
问题描述:
给出一个单链表,不知道结点N的值,怎样只遍历一次就可以求出中间结点?
单链表插入结点
关于单链表插入结点,大体要注意三种情况:
一是在第一个结点前插入;
二是在链表的中间插入;
三是在链表的最后插入。
另外还需要注意单链表没有指向前驱结点的指针,所以在实际程序中往往需要记录前驱结点,相信只要知道了这几点写出相应的代码就不太困难了。
代码如下:
#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;
}
运行结果:
![](http://img.blog.csdn.net/20130910155730187?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdHNhaXlvbmdfYWhuc2VsaW5h/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
编程实现单链表的逆置
代码如下:
#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;
}
运行结果:
给出一个单链表,不知道结点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;
}
运行结果:
相关文章推荐
- 给一个单链表,不知道结点N的值,怎样只遍历一次就可以求出中间结点,写出算法
- 给出一个单链表,不知道N的值,怎样遍历一次就可以求出中间结点
- 有关单链表的两个问题【遍历一次求中间节点,倒数第K个结点】
- 给出一个单链表,不知道节点N的值,怎样只遍历一次就可以求出中间节点,写出算法。
- 给出一个单链表,不知道节点N的值,怎样只遍历一次就可以求出中间节点,写出算法!
- 给出一个单链表,不知道节点N的值,怎么遍历一次就可以求出中间节点
- 笔试面试,单链表相关(3)遍历一次找中间结点、倒数第K个结点
- 查找单链表的中间节点,要求只能遍历一次链表(C语言)
- 一次遍历单链表中间节点
- 只遍历一次单链表,确定单链表中间节点的位置
- C语言:【单链表】查找单链表的中间节点,要求只能遍历一次
- 单链表遍历一次求倒数第k个结点和中间结点
- C语言:【单链表】查找单链表的中间节点,要求只能遍历一次
- 带头结点的单链表( 冒泡排序 一次遍历求中间结点的值) 链表 就地反转 倒数第k个结点
- 遍历一次求单链表中间节点
- 查找单链表的中间节点,要求只能遍历一次链表
- 删除单链表的头元素;单链表,只是遍历一次,求出中间节点
- 遍历一次单链表,找出单链表中间的值
- 只遍历一次单链表,确定单链表中间节点的位置
- 树的遍历 迭代算法——思路:初始化stack,pop stack利用pop的node,push new node to stack,可以考虑迭代一颗树 因为后序遍历最后还要要访问根结点一次,所以要访问根结点两次是难点