首页 > 其他分享 >重排链表

重排链表

时间:2023-09-11 21:01:29浏览次数:33  
标签:ListNode struct next 链表 重排 curr NULL

 解题思路:采用快慢指针的方法将单链表分成两半,再对两部分的链表进行合并

void reorderList(struct ListNode* head) {     if (head == NULL || head->next == NULL) {         return;     }         // 找到链表中间节点     struct ListNode* slow = head;     struct ListNode* fast = head;         while (fast != NULL && fast->next != NULL) {         slow = slow->next;         fast = fast->next->next;     }         // 翻转后半部分链表     struct ListNode* prev = NULL;     struct ListNode* curr = slow;     struct ListNode* nextTemp;         while (curr != NULL) {         nextTemp = curr->next;         curr->next = prev;         prev = curr;         curr = nextTemp;     }         // 合并两个链表     struct ListNode* firstHalf = head;     struct ListNode* secondHalf = prev;         while (secondHalf->next != NULL) {         struct ListNode* firstNextTemp = firstHalf->next;         struct ListNode* secondNextTemp = secondHalf->next;         firstHalf->next = secondHalf;         secondHalf->next = firstNextTemp;         firstHalf = firstNextTemp;         secondHalf = secondNextTemp;     } }

标签:ListNode,struct,next,链表,重排,curr,NULL
From: https://www.cnblogs.com/ymy1/p/17694492.html

相关文章

  • 138. 复制带随机指针的链表
    给你一个长度为n的链表,每个节点包含一个额外增加的随机指针random,该指针可以指向链表中的任何节点或空节点。构造这个链表的深拷贝。深拷贝应该正好由n个全新节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的next指针和random指针也都应指向复制链表......
  • 例2.9 建立一个带头结点的线性链表,用以存放输人的二进制数,链表中每个结点的data域存放
    1.题目例2.9建立一个带头结点的线性链表,用以存放输人的二进制数,链表中每个结点的data域存放一个二进制位。并在此链表上实现对二进制数加1的运算。2.算法分析3.代码/*二进制加1*/voidBinAdd(LinkListl){inttemp;Node*pa=l->next,*pb,*s;while(pa......
  • 例2.7 算法实现带头结点单链表的就地逆置问题。
    1.题目例2.7算法实现带头结点单链表的就地逆置问题。2.算法思想3.代码//就地逆置voidReverseList(LinkListL){Node*p,*q;p=L->next;L->next=NULL;while(p){q=p->next;p->next=L->next;L->next=p;......
  • Icoding 链表 删除范围内结点
    题目:已知线性表中的元素(整数)以值递增有序排列,并以单链表作存储结构。试写一高效算法,删除表中所有大于mink且小于maxk的元素(若表中存在这样的元素),分析你的算法的时间复杂度。链表结点定义如下:struct_lnklist{ElemTypedata;struct_lnklist*next;};typedefstruct......
  • 链表
            ......
  • java版本剑指offer:链表中倒数最后k个结点
    java版本剑指offer:链表中倒数最后k个结点描述输入一个链表,输出一个链表,该输出链表包含原链表中从倒数第k个结点至尾节点的全部节点。如果该链表长度小于k,请返回一个长度为0的链表。最简单的方式就是使用两个指针,第一个指针先移动k步,然后第二个指针再从头开始,这个时候这两个指针......
  • java版本剑指offer:反转链表
    java版本剑指offer:反转链表描述输入一个链表,反转链表后,输出新链表的表头。示例1输入:{1,2,3}返回值:{3,2,1}此题想考察的是:如何调整链表指针,来达到反转链表的目的。初始化:3个指针:1)pre指针指向已经反转好的链表的最后一个节点,最开始没有反转,所以指向null2)cur指针指向待反转链表......
  • java剑指offer:两个链表的第一个公共结点
    java剑指offer:两个链表的第一个公共结点描述输入两个无环的单链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)解题思路:先假设链表A头结点与结点8的长度与链表B头结点与结点8的长度相等,那么就可以用双指针。......
  • Java版剑指offer:链表中环的入口结点
    Java版剑指offer:链表中环的入口结点描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。输入描述:输入分为2段,第一段是入环前的链表部分,第二段是链表环的部分,后台将这2个会组装成一个有环或者无环单链表返回值描述:返回链表的环的入口结点即可。而我们后台程序......
  • 链表表示和实现
    链表表示和实现单链表的按值查找#include<stdio.h>#include<stdlib.h>structnode{ intdata; structnode*next;};typedefstructnodeNODE;NODE*create(){ intt; NODE*head,*p,*q; head=(NODE*)malloc(sizeof(NODE)); p=head; while(1){ p......