#include <iostream> using namespace std; struct Node { int value; Node *next; }; Node* createLinkedList(int *,int); void printLinkedList(Node *); Node* merge(Node*,Node*); Node* reverse(Node*); Node* createLinkedListInReverse(int *a,int n); void clearLinkedList(Node *); int main() { int a[8]; int b[10]; for(int i=0;i<sizeof(a)/sizeof(int);i++) a[i] = 2*i; for(int i=0;i<sizeof(b)/sizeof(int);i++) b[i] = 2*i+1; Node *head = createLinkedListInReverse(a,8); //head = reverse(head); printLinkedList(head); clearLinkedList(head); /* Node *c = createLinkedList(b,10); c = reverse(c); printLinkedList(head); printLinkedList(c); Node *m = merge(head,c); printLinkedList(m); clearLinkedList(m); */ cin.get(); } Node* createLinkedList(int *a,int n) { Node *head = new Node; Node *p = head; for(int i=0;i<n;i++) { Node* q = new Node; q->value = a[i]; q->next = 0; p->next = q; p = q; } return head; } Node* createLinkedListInReverse(int *a,int n) { Node *head = new Node; Node *p = 0; for(int i=0;i<n;i++) { Node *q = new Node; q->value = a[i]; q->next = p; head->next = q; p = q; } return head; } // 按照从小到大合并链表 Node* merge(Node* list1,Node* list2) { // 删除起始的头节点 Node* p = list1->next; delete list1; Node *q = list2->next; delete list2; Node *head = new Node; head->next = 0; Node *iter = head; while(p&&q) { if(p->value>q->value) { iter->next = q; iter = q; q = q->next; }else { iter->next = p; iter = p; p = p->next; } } if(p) iter->next = p; if(q) iter->next = q; return head; } Node* reverse(Node* head) { if(!head||!head->next||!head->next->next) //在只有一个节点之内 return head; Node *p = head->next; Node *q = p->next; p->next = 0; //important while(q) { Node *temp = q->next; q->next = p; p = q; q = temp; } head->next = p; return head; } void printLinkedList(Node *head) { head = head->next; while(head) { cout<<head->value<<"[ "<<head->next<<" ] "; head = head->next; } cout<<endl; } void clearLinkedList(Node *head) { while(head) { Node *p = head; head = head->next; delete p; } }
翻转的时候记得首个节点的next指针要置0,不然她默认还是指向原始的值,打印会出错