1 #include <iostream> 2 using namespace std; 3 typedef struct LNode 4 { 5 int data; 6 LNode *next; 7 }LNode,*LinkList; 8 //逆位序输入n个元素的值,建立带头结点的单链线性表 9 LinkList createLinklist(LinkList &L) 10 { 11 L = (LinkList)malloc(sizeof(LNode)); 12 L->next = NULL;//建立头结点 13 for (int i = 0; i <= 10;i++) { 14 LinkList p = (LinkList)malloc(sizeof(LNode)); 15 p->data = i; 16 p->next = L->next; 17 L->next = p; 18 } 19 return L; 20 } 21 //链表反转 22 LinkList listReversal(LinkList &L) 23 { 24 LinkList preNode=NULL; //前一个节点 25 LinkList node = L->next; //后一个节点(L为头结点) 26 LinkList nextNode = NULL;//中间节点 27 while (node!=NULL) { 28 nextNode = node->next; //保存下一个节点的值 29 node->next = preNode; //把当前节点的下一个节点指向preNode; 30 preNode = node; //将preNode向后移动指向此时的node 31 node = nextNode; //将node向后移动指向nextNode 32 } 33 L->next = preNode; 34 return L; 35 } 36 //中间位置反转 37 LinkList middlePositionInversion(LinkList &L) 38 { 39 LinkList Lhead=L->next; 40 int num = 0; 41 while (Lhead) {//就算链表的长度 42 num++; 43 Lhead = Lhead->next; 44 } 45 LinkList curNode = L->next; 46 int i = 1; 47 while (i<num/2+1) {//寻找要反转后的前一个节点的指针(退出循环后,第i个元素的指针为curNode) 48 i++; 49 curNode = curNode->next; 50 } 51 LinkList preNode=NULL; 52 LinkList node=curNode->next; 53 LinkList nextNode=NULL; 54 while(node!=NULL){ 55 nextNode = node->next; 56 node->next = preNode; 57 preNode = node; 58 node = nextNode; 59 } 60 curNode->next = preNode; 61 return L; 62 } 63 int main() 64 { 65 LinkList linkList; 66 LinkList L=createLinklist(linkList); 67 //LinkList LL=listReversal(L); 68 LinkList LL = middlePositionInversion(L); 69 LL = LL->next; 70 while (LL) { 71 cout << LL->data << " "; 72 LL = LL->next; 73 } 74 cout << endl; 75 return 0; 76 }