算法思想:
-
初始化两个指针:prev(前一个结点)和 current(当前结点),以及一个头结点指针 head。
-
从头结点开始遍历链表。
-
如果当前结点的数据值为负数,将它移动到链表的尾部。
-
如果当前结点是头结点,更新头结点指针,将头结点指向下一个结点,并将当前结点的 next 指针置为空。
-
如果当前结点不是头结点,更新 prev 的 next 指针,将 prev 的 next 指向当前结点的下一个结点,并将当前结点的 next 指针置为空。
-
将移动的负数结点连接到链表的尾部。
-
-
继续遍历链表,直到到达链表的末尾。
-
返回更新后的头结点指针,这将是链表中第一个负数
//定义单链表结构体 typedef struct LNode { int data; LNode* next; }LNode,*ListNode; //定义指针*ListNode指向单链表。后续可以直接用ListNode来使用struct LNode //定义一个函数,这个函数接受一个指向链表的指针作为参数(通常是头结点A),然后返回一个指向链表节点的指针 LNode* Sortlist(ListNode A){ //定义指针p,指针tail,指针minus,指针s LNode *p, *tail = A, *minus = NULL,*s = NULL; if(!A) { //判断指向A的指针是否为空 return NULL; //符合则返回NULL,不符合则执行下行代码 } p = A->next; //移动p指针指向头节点下一个节点 while(p) { tail->next = p; s = p; //把p指针赋值给s指针(s暂时指向p节点) p = p->next; s->next = minus; if(s->data >= 0) {//非负数,移动tail指针 tail = s; } else {//负数 minus = s; } } return minus; }
结点的位置。