- add_two_numbers_lists
解释:2个链表相加计算数值,比如5+11 = 16,感觉没啥用。 - cloneListWithRandomPtr
解释:链表中有一个随机指针,如何克隆这样的链表,主要分为2步,第1步把原来的链表通过插入新的链节的方法复制一倍,然后把加长的链表分离2个链表,实现克隆的目的。
形象如下:
List in format (Node data, Random Node data) :
(1, 3)–>(2, 1)–>(3, 5)–>(4, 3)–>(5, 2)–>NULL
List in format (Node data, Random Node data) :
(1, 3)–>(1, 3)–>(2, 1)–>(2, 1)–>(3, 5)–>(3, 5)–>(4, 3)–>(4, 3)–>(5, 2)–>(5, 2)–>NULL - deleteLinkedlist
解释:就是按规则删除链表,暂无。 - deleteNode
解释:常规操作,把指针指向下一个链表节点。然后删除当前的节点。 - findIntersectionPointOfLists
解释:就是把一个链表的指针指向另一个指针,然后找到这两个指针重合的位置。一般比较容易想的是比较指针的地址,其实比较长度就可以了,只需要比较1次。 - floyedCycleDetection
解释:使用经典的佛罗伊的循环查找算法,找到循环开始的位置,方法比喻:A以B的2倍速度先跑,那么A一定先进入循环,当A再次遇到B时,A比B多跑了一个循环,而如果这时候让A从原点以同B一样的速度开始走,B继续走,则A与B再次相遇的点就是循环的起点。可以编写算式验证。比如x1+x2 =a; x1+x2+l = 2a ,即得x1+x2 = l(l为一个循环的长度) - insertInASortedLinkedList
解释:不难理解,就是比较大小后重排列。这个功能是插入时即排列。有点像sortedarray。 - listDemo
解释:List封装了链表,Vector封装了数组,List和Vector最主要的区别在于vector使用连续内存存储的,vector支持[]运算符,而List是以链表形式实现的,不支持[],Vector对于随机访问的速度很快,但是对于插入尤其是在头部插入元素速度很慢,在尾部插入速度很快。List对于随机访问速度慢得多,因为可能要遍历整个链表才能做到,但是对于插入就快的多,不需要拷贝和移动数据,只要改变指针的指向就可以了。另外对于新添加的元素,vector有一套算法,而List可以任意加入。 - listPallindrome
解释:使用了与 floyedCycleDetection差不多的策略,就是先平分链表,然后反转链表,然后进行比较,如果有不同的data说明不是对称链表。 - merge_sort
解释:并归排序,还没有完全吸收代码。 膜拜一下这个程序。实现了并归排序,里面最精华的部分就是moveNode,它的参数类型是* &,活了那么久第一次见(自己low),来看下代码,其他没什么就是并归排序十大经典排序算法(动图演示)
void moveNode( Node * & dstNode, Node * & srcNode )
{
if (srcNode == nullptr) {
return;
}
//srcNode的next赋值给nextNode
Node * nextNode = srcNode->next;
//把srcNode传入dummy,记住这里是dummy,下一步dstNode的地址和dummy就不一样了,因为这里传进来的参数是* &,既可以改变地址指向的值也可以改变地址
dstNode->next = srcNode;
//dstNode地址被改变
dstNode = srcNode;
//srcNode地址被改变,这里nextNode没有被delete,数量大了会不会有内存泄露啊!
srcNode = nextNode;
}
这里*&的解释C++中*和&同时使用是什么意思?,其实这个&的作用就是引用,可以改变指针地址的值。
- nthToLastNode
解释:查找倒数第几个节点的位置。读懂这个,实现的原理就不难了。 - printMiddleNode
解释:没啥,就是一快一慢的策略。 - rearrange_list
解释:没啥,如果有的话我觉得亮点在reverse函数,其实就是一步一步把头节点分离出来,然后反过来输出。
void reverse( Node * & head )
{
Node * nextNode = nullptr;
Node * newHead = nullptr;
Node * curr = head;
while( curr ) {
nextNode = curr->next;
curr->next = newHead;
newHead = curr;
curr = nextNode;
}
head = newHead;
}
- removeDuplicatesFromSortedList
解释:当比较不相等时,把地址重新赋值到head-next中。 - reverseAlternateNodes
解释:和merge_sort差不多。忘了*&的含义,还是我介绍的清楚。其他应该没有什么。 - reverseLinkedListlterAndRecurse
解释:reverseIter比较好理解,reverseRecur使用嵌套的方式进行翻转,单步调试大致明白,不好理解,不过也没有什么就是实现了翻转。 - swapNodesWithoutSwappingData
解释:通过交换节点实现,分别预处理出要交换节点的前后节点链表,然后经过一顿操作(待深入分析),实现节点交换。