#include<iostream>
#include<malloc.h>
using namespace std;
typedef struct node
{
int num;
struct node *next;
}Node;
Node * CreateList(int a[], int n)
{
Node *head, *p, *q;
head = (Node*)malloc(sizeof(Node));
head->next = NULL;
p = head;
for(int i=0; i<n; i++)
{
q = (Node*)malloc(sizeof(Node));
q->num = a[i];//数组元素给链表赋值!!!
p->next = q;
p = q;
}
p->next = NULL;//将最后一个结点的指针域清空
return head;//返回这个链表的首地址
}
void PrintList(Node *head)
{
Node *p;
p = head->next;//从第一个元素(头元素)开始,依次往后
while(p)
{
cout<<p->num<<" ";
p = p->next;
}
cout<<endl;
}
/*--------------------------------------------------------------
删除链表头元素/
----------------------------------------------------------------*/
void DeleteHead(Node *head)
{//删除第一个元素(头元素)
Node *p;
p = head->next;
head->next = p->next;
free(p);
}
/*--------------------------------------------------------------
一次遍历单向链表找到中间节点/
具体方法和思想:
1)设置2个指针,p1,p2;一个走2步时,另一个走1步;
2)那么一个走到头时,另一个走到中间。
类似的可以用一次遍历方法得到三分之一、四分之一、前几个节点。
----------------------------------------------------------------*/
void SearchMid(Node *head)
{//一次遍历单向链表找到中间节点!!!
Node *p1 = head;
Node *p2 = p1;
//Node *mid;
while(p2)
{
p2 = p2->next;//p2第一步
if(p2 != NULL)
{
p2 = p2->next;//p2第二步
p1=p1->next;//在p2走两步的情况下p1走一步
}
}
cout<<p1->num<<endl;
}
int main()
{
int a[]={1, 2, 3, 4};
Node *head = CreateList(a, 4);
PrintList(head);
SearchMid(head);
DeleteHead(head);
PrintList(head);
SearchMid(head);
return 0;
}
结果:
1 2 3 4
2
2 3 4
3
Process returned 0 (0x0) execution time : 0.076 s
Press any key to continue.