链表(一锅端了数据结构与算法系列之链表)

本文结构
1.链表的概念特点
2.链表算法解题思路
3.代码实战,从链表的定义,到基本的增删改查,到简单问题的解决,到一些思想,如快慢指针,头插法解决问题

1.链表的概念特点

1.链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
2.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。
3.每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域

链表的效率:由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。

2.链表算法解题思路

主要是对指针的运用,简单的题目用单指针就可以,中等的需要双指针,快慢指针
更有难度的是头插法
解决链表问题核心是画图找出指针之前的转换关系

3.代码实战,从链表的定义,到基本的增删改查,到简单问题的解决,到一些思想,如快慢指针,头插法解决问题

3.1链表的结构定义
单链表

public class ListNode {
    int val;
    ListNode next;
    public ListNode(int val){
        this.val=val;
    }
    ListNode(){
        
    }
    public ListNode(int val,ListNode next){
        this.val=val;
        this.next=next;
    }
}

双链表

public class ListNode1 {
    int val;
    ListNode next;
    ListNode pre;
    public ListNode1(int val){
        this.val=val;
    }
    ListNode1(){

    }
    public ListNode1(int val,ListNode next,ListNode pre){
        this.val=val;
        this.next=next;
        this.pre=pre;
    }
}

OK 7.8做的两道题
83. 删除排序链表中的重复元素

class Solution {
  public ListNode deleteDuplicates(ListNode head) {
//     需要一个值储存前节点的值
        if (head==null||head.next==null){
            return head;
        }
        ListNode temp=head;
        int pre=head.val;
        while (temp.next!=null){
           if (temp.next.val==pre){
               temp.next=temp.next.next;
              }else {
           temp=temp.next;
           }
            pre=temp.val;
        }
     return head;
    }
}

双指针解决
82. 删除排序链表中的重复元素 II

class Solution {
public ListNode deleteDuplicates(ListNode head) {
        if (head==null||head.next==null){
            return head;
        }
     ListNode dummy=new ListNode();
     dummy.next=head;
     ListNode pre=dummy,cur=head;
     while (cur!=null&&cur.next!=null){
         if (pre.next.val!=cur.next.val){
             pre=cur;
             cur=cur.next;
         }else {
             while (cur.next!=null&&pre.next.val==cur.next.val){
                 cur.next=cur.next.next;
             }
             pre.next=cur.next;
             cur=cur.next;
         }
     }
     return dummy.next;
    }
//    public ListNo
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值