单链表思路总结

单链表基本

1.打印时通常设定一个cur指向 利用while循环

2.尾插通常也设定一个cur指向 一直到node.next==null 利用cur.next=node;

3.当要在一个任意index位插入一个节点时

1.要先判断index的合法性

2.判断index的位置  看是否可以等价于头插或尾插

3.要新创一个方法去找到index前一个位置

4.当要删除第一次出现key的节点

1.判断head是否为空

2.判断head是否我们要删的节点

3.如果head不是所寻 那么创建一个方法找到要删的前一个 

为什么不找要删的那一个呢?

因为链表指向的原因

  

5.当要删除所有数据为key的节点

1.先不删头 从头后一个开始删

2.perv指向头 cur指向head.next

3.二者进行过程表演

4.最后检查head是否要删

单链表习题

1.反转单链表

1.设定三个指向 prev cur  curNext

初始化时cur指向head  prev curNext为null

2.三者指向相对位置不发生变化  

3.进行过程推演

若只有头一个节点 那么返回newhead置为null返回

2.找链表的中间节点

1.创建一个fast一个slow 起始都指向head

2.判断head是否为null  为null直接返回slow

3.

while(fast!=null&&fast.next!=null)

这个循环开始 fast每次走两步 slow走一步

分析一下为什么fast在前 fast.next在后

倘若fast为空那么fast.next为空的空 则会造成空指针异常表现 

3.找到链表倒数第k个节点

这个有点巧妙

public Node findk(int k){
            Node fast=this.head;
            Node slow=this.head;
            while(k-1>0){
                fast=fast.next;
                k--;
            }
            while(fast.next!=null){
                slow=slow.next;
                fast=fast.next;
            }
            return slow;
}

4.对一单链表 把小于x的结点排前面大于x排后面

1.先给定一个cur指向head

2.给定两个位域  as bs指向其一  

ae be指向其二

3.while(cur!=null)给定循环判断

4.判断cur指向数据与x的关系

5.考虑as bs或ae be指向的两域是否为第一次存放

变化过程中 as ae不动  bs be指向改变

6.当退出while循环后 注意判断bs是否为空 若为空直接返回as即可

7.若bs非空 进行拼接  be.next=as

  //我们已经 把小于x的放到bs那一块 大于等于的放到as那一块
    //由于要求小的在前 那么拼接注意 把as接到be后面
    //并且 be.next应为null
            if(bs==null){
                return as;
            } else {
                be.next=as;
            }
            if(ae!=null){
                ae.next=null;
            }
            return bs;
}

5.判断是否为回文链表

1.先找到中间结点

2.反转后边一半的链表 不反转怎么进行第三步的从后往前走?

3.让head往后走 一个往前走 看相遇过程

4.若有元素数据不等 则false  

5.若为偶数则不会相遇但next域可进行判断

6.两种特殊情况

 if(this.head==null){
                return false;
            }
            if(this.head.next==null){
                return true;
            }

7.代码如下

 public boolean huiwen() {
            Node slow = this.head;
            Node fast = this.head;
            if (this.head == null) {
                return false;
            }
            if (this.head.next == null) {
                return true;
            }
            while (fast != null && fast.next != null) {
                fast = fast.next.next;
                slow = slow.next;
            }
            Node prev = null;
            Node curNext = null;
            Node cur = slow.next;
            //这样设定保证slow最后循环结束会指向最后一个节点
            while (cur != null) {
                curNext = cur.next;
                cur.next = slow;
                slow = cur;
                cur = cur.next;
            }
            while (slow != head) {
                if (this.head.val != head.val) {
                    return false;
                }
                if (this.head.next == slow) {
                    return true;
                }
                slow = slow.next;
                head = head.next;
            }
        return true;
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值