3-7(单链表的相关算法题)

今天仍是继续刷单链表的相关算法题
一、链表分割:就是将一个链表的值按照小于x或者大于等于x排序,但不改变相对位置。如链表1-3-5-2-6-7-4.x==4
排序后的单链表应该为1-3-2-5-6-7-4;
思想:定义2个头结点lesshead,greathead,而且须要2个尾节点lesstail,greattail;这个方面须要注意一点就是头结点的定义不是和指针定义同样,节点的定义须要malloc申请,listnode lesshead=(listnode)malloc(sizeof(listnode));第二步须要定义一个cur指针指向须要分割的链表,并将其每一个节点的元素值与x比较,小于x的用尾插法插到lesstail后面,别的插到greattail的后面。这里买呢而后再将lesstail->next=greathead->next; greattail->next=NULL;必定须要将greattail->next=NULL,由于greattail做为新排序的尾部。
二、链表的回文结构(对称结构)如1-2-3-2-1;1-2-2-1.这样都是回文结构,
思想:利用快慢指针,来将链表中间分割,在将后半部逆序,和前半部的值一一比较,若是同样,就为回文结构。
须要注意一点就是记得定义一个Prev指针,来指向中间指针的前一个,由于须要将中间指针的前一个置为空。
三、相交链表:找到2个链表相交的起始节点
思想:2个链表相交,也就是2个链表有个共同的节点,也就是tail地址同样。
第一步:遍历2个链表,求出其2个链表的长度la,lb。利用abs(la-lb)求出这2个链表的差值的绝对值,第二步将长的链表独自移动abs位,这样就能够保证其2个链表的长度同样,就能够一一比较2个链表的地址。为何须要移动长链表到2个链表长度同样呢?答:由于 相交说明2个链表有个共同节点,也就是2个链表都存储了其地址值,因此须要一一对比,
四、环形结构:判断一个链表是否有环:
思想:快慢指针思想,将快指针一次移动2个节点,慢指针一次移动一个节点,若是有环,快指针一定会在环里面与慢指针相遇,假设快慢指针相距x,每走一次距离会缩短1,终会出现x等于0,因此一定有环,至于快指针一次为何走2个节点,由于走3个节点或者n个节点都有可能使其2个指针遇不到。node

五、环形结构Ⅱ:输出一个环形的人口节点
思想:一:利用假设在某个节点相遇,则将该节点前面的做为一部分,后面的做为一部分,将先后2部分做为2个链表,而后利用相交能够求出其入口。
二:利用快慢指针,找到相遇节点,而后利用数学距离公式,能够求人口算法

相关文章
相关标签/搜索