Day4 两两交换链表 || 删除倒数第N个节点 || 链表相交 || 环形链表 || 总结

1. 24 两两交换

题目
题解

这题用虚拟头节点来换。

1.1 tips

我的写法:

temp.next = cur;
cur.next = pre;
pre.next = cur.next;
temp = pre;

问题出在第三步,我的这个写法其实就是从头往后弄,0接到2,2接到1,1.next接到2.next,问题是我先把2的后面变了,所以第三步1.next就是1,所以会一直循环,

正确的方法是从后向前。先操作1.next,这样就不会出现死循环了

  • 这题判断temp后面的两个元素存不存在的方法就是直接在循环的condition里写(temp.next && temp.next.next),和判断链表为空用的(!head)有异曲同工之妙。
  • 这个和反转整个链表一样都是设了三个指针,只不过这个题的temp是用来移动,pre和cur用来存值(在while开头就let pre =temp.next,这样后面就算变temp.next,pre也不会变)和比较;
    • 而在反转整个链表的时候,temp是为了存值,pre和cur来移动。并且整个反转的时候没用头节点。
    • js里的ListNode是对象形式的,所以是通过引用赋值,意思是:
    let a = b ={ val:2 }
    
    如果让b.val =4,因为a和b指向的是同一个对象,所以这么改a也会改变,
    如果不想这么改,就把a指向一个新的对象,比如:
    let a = b = { val: 2 }
    a = { val: 3 }
    
    类比pretemp.next是一样的
    pre = temp.next指向的是同一个对象a,然后
    temp.next = cur就指向了另一个对象b,a的值当然不会被影响
  • 引申下来,js的基本类型是值赋值,
    let a = b=10; b=11;b赋给了新值,a的值自然也不会改变。

2. 19删除链表的倒数第N个节点

题目
题解

2.1我的思路

找到最后一个->按n开始回头遍历->找到cur->用cur、pre、temp
后面更改思路,发现不用,知道链表长度sz后,让cur指针往后移动sz-n个节点就行了,该节点就是要删除的节点的前一个节点

const res = new ListNode(0,head);
    let cur = res;
    let sz = 0 ;
    while(cur.next !== null){
        cur = cur.next;
        sz +=1;
    }
    cur =res;
    if(n === sz){
        cur.next = cur.next.next;
        return res.next;
    }
    let count =0;
    while(count < sz-n ){
        // console.log(count,',',sz-n)
        cur=cur.next;
        count++;
    }
    cur.next = cur.next.next;
    return res.next;

上步也多余了,把if那里可以删掉,因为头节点的引入就是为了处理删除首位的问题的,

2.2法2快慢指针法

让快指针先走n步,再同时移动快慢指针,当快指针指向null时,慢指针指的就是要删的元素,但是我们要删应该是停在他的前一位,所以让
快指针先走n+1步,再同时移动
抽象的理解方式是,我先让快的走n步,这样快的和慢的之间就差了n,所以当再同时移动之后,快的指的是null的时候,慢的就相当于倒数第n个,比如n=1,要的是倒数第一个,让fast先走1,当共同移动后当fast指向null的时候因为fast和slow的布长差1,自然slow指向的就是倒数第一个。


3. 160链表相交

题目
题解

3.1我的思路:

我想的是for套for,来找相同,并且相同的判定标准应该是val =val,.next =.next,然后想着既然是for套for能不能用双指针

3.2教的思路

重点是如果有相交节点,那后面的节点应该完全一样,所以把他们的尾端对其,两个链表起点各放一个指针,同时移动,如果找到相同节点或者都移动到结尾就返回

在js中,怎么算相同节点呢?前面一到题提到了,listnode在js里是用对象定义的,而对象又是引用赋值,所以:
在js中比较两个节点是不是同一个,不是比较他们的val和next是不是相同,而是用===直接比较节点,这个时候在比较的是对该对象的引用,也就是他们是不是同一个对象,是的话他们的后面自然相同

3.3 tips

  • 教的代码里用了一段代码来交换节点,目的是为了确保A一定是更长的那个,也就是 [curA,curB] = [curB,curA]这是ES6里出现的解构赋值
    • 我刚听到这个的时候马上想着为什么没把这个直接用到交换节点的那道题上,答案是因为那个是在交换节点,而这个是在交换两个引用,并没有改变链表结构,如果交换节点的时候用结构赋值,就会出现环,因为只是改了引用,.next还是没改,node1的.next就是node2

4. 142.环形链表2

题目
题解

4.1我的思路

不知道怎么判断回来,我的思路是把遍历过的value存起来,但是如果有重复value呢?

4.2思路

1.怎么判断有环(fast和slow步长不同,有环会在环内相遇)
fast步长为2,slow步长为1。会在环内相遇是因为fast套圈了,fast比slow每次快一步,就会一个一个节点的靠近它(三个步长的话可能就跳过去了)画个图就懂了。
相遇的情况是,各再走一步就碰上了。


image.png

2.有环的话怎么找入口.

image.png

等式2(x+y) = x+y+n(y+z) 因为x走的路乘2才是y走的路。
最后要求的是X,把等式简化了之后得到x=n(y+z)-y但是这样看不出x和什么正数有关系,再简化成x=(n-1)(y+z)+z.因为n是大于等于1的,也就是至少要转1圈和慢指针相遇,n=1时等式为:
x=z
只是看等式还是有点抽象,看图,n=100和n=1是一样的,关键的是z的长度,只不过加了很多圈,但是如果从相遇点和head点各放一个指针,他们都会在同一个地方相遇


5.链表总结

  1. 什么时候用虚拟头节点:
    当需要改变链表结构的时候,比如删除节点,调换节点,一个特例是调换整个链表,用的三个值法。

  2. 如果用了虚拟头节点,返回值的问题
    返回的应该是return dummyNode.next,因为head指向的原本的第一个节点可能被删除或者移动,从而不再是第一个节点。

  3. 排除空和只有一个节点的写法
    if(!head || !head.next)

  4. 该节点的下一个节点不是null的写法
    我老写成while(cur.next !==null)因为担心直接写while(cur.next)如果碰上=0怎么办,因为0也是falsy value,这就是纯纯的搞错了,因为cur.next是对象,而不是对象的.val,是不可能取到0的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容