82原題地址
與之類似的還有86.分隔鏈表
86更簡(jiǎn)單一些:
比x小的都在大于等于x的節(jié)點(diǎn)之前珊泳,我是這樣做:
定義三個(gè)指針:
q指向當(dāng)前已經(jīng)有序的鏈表里热某,小于x的最后一個(gè)欺嗤;
cur記錄當(dāng)前有序鏈表的最后一個(gè)杜耙;
p用來(lái)遍歷;
遍歷p的時(shí)候合住,如果p大于等于x就不用處理西设,但小于又分兩種:
1.頭部大于等于x察绷,需要換到頭部前面汁针;(只處理一次)
2.其他情況下遮斥,p只需要續(xù)到q后面;
正常的思路應(yīng)該是:
cur->next=p->next;//后面的移除p
q->next=p;//前面的插入p扇丛;
p->next=q->next->next;
那么我假設(shè)這里的情況是 1 2 3 4 5,x是5
那么到p=3的時(shí)候 q=2尉辑;cur=2帆精;
然后你就會(huì)發(fā)現(xiàn):cur==p的前提下,2的下一步會(huì)成為p隧魄,原先的p->next會(huì)丟失卓练。
所以cur==p的情況需要單獨(dú)處理:
p,q购啄,cur三個(gè)指針都順移一位就可以了襟企。
82比86復(fù)雜的點(diǎn)在于:
當(dāng)A點(diǎn)與下一個(gè)點(diǎn)相等,往后順延等于next即可狮含,A點(diǎn)本身如何刪去顽悼?
固然保留A前面的點(diǎn)是一種方法,
但我要判斷A->next==A->next->next 保證他們非空的鏈條也太長(zhǎng)了
所以說(shuō)之前那種強(qiáng)行搬指針的路是很要命的
題解的思路才是正常刷題人的想法:
1.快慢指針几迄;
2.虛擬頭結(jié)點(diǎn)蔚龙;
以86為例,分別做兩個(gè)頭結(jié)點(diǎn)映胁,p指向head木羹,q指向大于等于x的節(jié)點(diǎn);
那么處理起來(lái)只需要:
創(chuàng)建兩個(gè)新鏈表解孙,小于x的(包括head)跟在p后面坑填,大于x的放在q后面抛人;(注意保持q->next=null)
然后p->next=q,返回p的頭部就可以了;