7

2021.12.20刷题笔记--链表系列

 2 years ago
source link: https://segmentfault.com/a/1190000041151113
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

2021.12.20刷题笔记--链表系列

发布于 1 分钟前

链表有很多繁琐的地方。往往再一些细节上的处理,是很重要的,当然,链表我个人认为是最看重细节的地方,但是链表如果说能够一步步理清楚细节,实际上是可以写出来的。

从一到最简单的反转链表开始做起
剑指 Offer 24. 反转链表

毫无疑问,我们需要三个指针去反转
我们再脑海中想象一条链表
help->1->2->3->4->5->NULL
这个时候 脑海中将1指向help,然后呢?我们是不是需要提前保存2的值,因为我们将1指向help的时候已经没有2的引用了,所以再1指向help之前,我们先保存下2的引用,一直重复这个过程,直到什么时候?是不是直到最后一个节点无法指向前一个节点的时候,很显然,判定条件就是cur!=null

ListNode pre = new ListNode(-1),help = pre,pre.next=head,cur = head,next;

while(cur!=null){
    next = cur.next;
    cur.next = pre;
    pre= cur;
    cur = next;
}
return help.next;

这是一种方法。还有没有其他的方法?
help->1->2->3->4->5->NULL
同样是这条链表。
如果我们将节点2摘下来,插入help->1之间 是不是实现了局部的反转,一直重复这个过程,是不是就是实现了链表的反转?
现在想,如何实现这个过程?

ListNode pre = new ListNode(-1),next;
pre.next=head;
while(head.next!=null){
    next = head.next;
    head.next = next.next;
    next.next = pre.next;
    pre.next = next;
}
return pre.next;

进阶一点呢?
25. K 个一组翻转链表
区间内反转,这里只将第二种反转,反转完了之后是不是当前区间的head节点成为下一个区间的pre节点?下一个cur节点是不是当前cur节点的next节点?

ListNode pre = new ListNode(-1),help = pre,countNode = head,next;
pre.next = head ;
int count = 0;
while(countNode!=null){
    count++;
    countNode = countNode.next;
}
for(int i =0;i<count/k;i++){
    for(int j= o;j<k-1;j++){
        next = head.next;
        head.next = next.next;
        next.next = pre.next;
        pre.next = next;
    }
    pre= head;
    head = head.next;
}
return help.next;

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK