算法体系结构第九课

一、寻找链表的中点
(1)需要链表长度在3及其以上
(2)一个快指针一个慢指针

1.中点或上中点

Node slow = head.next;
Node fast = head.next.next;
或者
Node slow = head;
Node fast = head;

2.中点或下中点

Node slow = head.next;
Node fast = head.next;

3.中点的或上中点的前一个结点

Node slow = head;
Node fast = head.next.next;

4.中点的或下中点的前一个结点

Node slow = head;
Node fast = head.next;

快慢结点都在链表头部,对应着第一种情况midOrUpMid,只不过第一种情况少走了一步而已;
剩下的几种情况都是在原始情况下的变种

二、判断一个链表是否是回文结构
1.把链表放进一个栈里,依次弹出元素与链表相比较

2.把链表从末尾依次往回指,一直指到中点或者上中点(下中点也行),从头和尾依次比较,但是链表指针改变时比较复杂,而且判断完成后链表还需要调回来,需要小心
(1)用快慢指针找到链表的中点或者上中点,让它指向空,把后半边链表往回指

需要从中间开始进行操作,初始条件:p1指向空,获取需要操作的结点p2,当p2 != null时就循环
		{
    
    用p3记一下p2的next,p2的next指向p1,p1和p2都往右移,进行下一步操作}

							Node p1 = midNode;
							Node p2 = p1.next;
							p1.next = null;
							Node p3 = null;
							while (p2 != null) {
    
    
								   p3 = p2.next;
								   p2.next = p1;
								   p1 = p2;
								   p2 = p3;
}
记忆点:p2获取中点next,中点next置空,循环,p3获取p2的next,反指,整体右移;

(2)判断:上面的循环跳出时,p1指向了最后一个元素,p2指向空,挨个比较就好
(3)链表恢复:从链表的末尾开始恢复,因为如果从中间开始往右边恢复的话,指针是回指的,会找不到后面一个元素;

在判断之前需要用p3指针记一下那时的p1指针,也就是记一下末尾的位置,p2记一下p3的next,再让next指
向空,因为此时还是操作的p2,所以循环应该是p2 != null,循环
		{
    
    p1记一下p2的next,p2的next指向p3,p2和p3往左移一位}
		p2 = p3.next;
		p3.next = null;
		while (p2 != null) {
    
    
		    p1 = p2.next;
		    p2.next = p3;
		    p3 = p2;
		    p2 = p1;
}

三、在O(N)时间复杂度和O(1)空间复杂度的前提下复制一个包含下一个next指针和随机rand指针的链表

1.用HashMap,把新旧结点加入到map里,设置好它的两个指针

2.把新结点插入到旧结点中间
(1)新结点创建出来插入到旧结点的中间,
(2)设置新结点的rand指针
(3)设置新结点的next指针,并旧恢复链表

四、链表荷兰国旗

1.把链表转换成数组进行Partition
(1)获取链表大小
(2)通过链表建立结点数组
(3)对结点数组进行Partition
(4)依次连接结点数组

1.1数组Partition
(写不出来就去干工地)

2.空间复杂度O(1)的好办法
(1)准备小中大的头尾共6个指针和next指针,遍历链表,根据标称值进行三条链表的建立,再对三条链表进行连接:
A.准备小中大的头尾共6个指针和用于记录next的指针;
B.对链表进行遍历,记录next,与.next断连(.next指向空),判断看分入哪一个链表;
C.分类,如果对于某一条链表是第一个加入的,就让头和尾都指向他,不是就让尾的next指向它,再移动到它;
(2)链表的连接:
A.三条链表都存在的话是让小于区域的尾巴.next连等于区域的头,等于区域的尾巴.next连大于区域的头;
B.有小区时,让小尾连等头,谁不空,eT就等于谁;(eT已经尽量不为空)
C.有等区时,让等尾连大头;

注:不用mT = mT == null ? eT : mT的原因是:
	大区为空时,mT没有任何作用,大区不为空时,mT不变,所以没有意义;
	需要eT = eT == null ? sT : eT的原因在于eT是需要连接mH的;

D.从小到大谁不空就返回谁的头指针

Guess you like

Origin blog.csdn.net/dgytjhe/article/details/119836474