单链表基本操作总结(2)

逆置操作:

/**单链表逆置,将头结点后的节点一个个断开,使用头插法插入在头结点后*/ ListNode * Reverse_list(ListNode *head) { if(NULL == head) return head; if(NULL == head->next) return head; if(NULL == head->next->next) return head; /**要实现逆置,除了头结点外,至少需要2个数据节点*/ ListNode *curr, *temp; curr = head->next; /**curr用来保存断开后的那一串*/ head->next = NULL; /**头结点与后面结点断开*/ while(NULL != curr) { temp = curr->next; /**temp起临时代替curr的作用*/ curr->next = head->next; /**头插法*/ head->next = curr; curr = temp; /**temp将功能还给curr*/ } return head; }

单链表排序(使用冒泡排序法):此排序算法,仅交换了数据,没有交换结点

void Swap_data(int &a,int &b) /**这里必须要加引用符,不然交换没效果*/ { int temp; temp = a; a = b; b = temp; } ListNode * Sort_list(ListNode *head) { int i,len; ListNode *p; len = head->data; p = head->next; if(NULL == p) cout << "list is null" << endl; for(i = 1; i <= len; i++) { while(NULL != p->next) { if(p->data > p->next->data) Swap_data(p->data,p->next->data); p = p->next; } p = head->next; } return head; }

一个特别的函数:用于找出单链表中间节点,在不知道节点总数的情况下

/**不知节点总数,只遍历一次就可以求出中间结点*/ /**这个函数有问题,只能对节点为奇数的求解,节点为偶数时,会出现p->next->next无意义的情况,使程序发生错误*/ /*原理是:找两个指针,一个每次走一步,另一个每次走两步,当走两步的指针到结尾时,走一步的指针刚好走到中间结点处*/ void Search_mid(ListNode *head) { ListNode *p_1,*q_2; ListNode *mid; p_1 = head->next; q_2 = head->next; while(NULL != q_2->next) { p_1 = p_1->next; q_2 = q_2->next->next; mid = p_1; } cout << "中间值为: " << mid->data << endl; }

测试主函数:

int main() { ListNode *p; int a=3; int b = 4; p = Create_list(5); cout << "The list is:" << endl; Output_list(p); Length_test(p); p = Insert_node(p,6,5); cout << "插入节点后:" << endl; Output_list(p); cout << "New length: " << p->data << endl; p = Delete_node(p,3); cout << "删除节点后:" << endl; Output_list(p); p = Reverse_list(p); cout << "逆置后:" << endl; Output_list(p); p = Sort_list(p); cout << "排序后(从小到大):" << endl; Output_list(p); cout << "原ab: " << a << b << endl; Swap_data(a,b); cout << "交换后: " << a << b << endl; Search_mid(p); return 0; }

本文永久更新链接地址

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/d876bb0efc46bbf623666911e965cf58.html