QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5133|回复: 0
打印 上一主题 下一主题

【Java演示】什么是链表?数据结构

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2020-5-4 15:55 |只看该作者 |正序浏览
    |招呼Ta 关注Ta

    * \# H. p# y1 Q9 A( w( @【Java演示】什么是链表?数据结构
    6 o* u. p- u& F% U5 w& t  e9 {+ S一、单向链表
    ' f  C1 h7 L1 F5 f9 a# h
    2 f0 A6 o0 f/ i4 e1 O& B3 r9 h# c 1.png
    3 F& z# F- w1 K! Z$ Q% `) l链表(linked list)是一种在物理上非连续、非顺序的数据结构,由若干节点(node)所组成。7 S. E; s; a' A2 a" l2 k
    单向 链表的每一个节点又包含两部分,一部分是存放数据的变量data,另一部分是指向下一个节点的指针next。9 W& A* t. ]3 C! F! C& h( s
    链表的第1个节点被称为头节点,最后1个节点被称为尾节点,尾节点的next指针指向空。! V1 Y$ {9 m1 ?

    : a4 B7 n6 @- `什么叫随机存储呢?
    * }2 P$ K% Y# W8 q
    $ f- Y- L" O% m6 ]1 I如果说数组在内存中的存储方式是顺序存储,那么链表在内存中的存储方式则是随机存储 。
    " C6 T! d3 t5 b& Q" ]' e" H% c上一节我们讲解了数组的内存分配方式,数组在内存中占用了连续完整的存储空间。而链表则采用了见缝插针的方式,链表的每一个节点分布在内存的不同位置,依靠next指针关联起来。这样可以灵活有效地利用零散的碎片空间。, g( H) }7 U; F/ k
    3.png ( }: b' e2 Z4 v9 G

    9 g7 F! `- V1 t

    图中的箭头代表链表节点的next指针。

    链表的基本操作1. 查找节点

    在查找元素时,链表不像数组那样可以通过下标快速进行定位,只能从头节点开始向后一个一个节点逐一查找。

    4.png 2 V4 b& }4 W4 f+ z' Q
    0 A0 ^9 S) C: [' _$ B7 B
    /**1 M" o% z& U8 _$ ^, A1 `& e) R
         * 链表查找元素
    $ A* S3 i9 \) Y! A' C( p     *
      L- N) M! F1 V     * @param index 查找的位置3 H) M' ^* A5 D( A1 G5 y
         * @return index位置的Node对象/ B$ z# Z# L, p# S* D- V
         */
    : W! D; f1 P( R) x4 P    public Node get(int index) {+ F# A" Z* P' j: s# V$ j/ }; q, l
            if (index < 0 || index > size) {  V! F; b$ q! h4 s1 w
                throw new IndexOutOfBoundsException("超出链表的节点的范围!");4 r$ c( r/ ]0 s# ?
            }
    8 h8 X8 P0 w9 v, Q        Node temp = head;
    6 X( M. s  H$ t" n        for (int i = 0; i < index; i++) {$ G& ^; G5 v: X( c2 ?/ u3 k4 |% A9 R
                temp = temp.next;. F# f: H) u2 |# p) b
            }: z- u( Z2 Z$ ~7 r$ D$ @
            return temp;# N2 q. B" o2 ~) z/ I8 f) S
        }
    $ p0 T; d  i0 [$ a  B  R# c/ x4 Z% _1 @$ g

    链表中的数据只能按顺序进行访问,最坏的时间复杂度是O(n)

    2. 更新节点 5.png $ W7 H+ q0 X6 ^
    - u3 ]1 S2 g. q6 R! K) V) \
    如果不考虑查找节点的过程,链表的更新过程会像数组那样简单,直接把旧数据替换成新数据即可。. L; Y7 V. E( O! t; h5 s
    如果不考虑查找元素的过程,只考虑纯粹的更新节点操作,时间复杂度是O(1)+ n# L6 W% C8 n1 T- X# W
    /**
      C, X) t# ?# c/ |     * 更新节点 将列表中指定位置的节点的data替换为指定的data。
    9 `- J+ e3 D0 [; f: D     *
    ( e* o* w, A( ~, @6 V+ Y0 _# L     * @param index 需要更新的节点的位置6 `, J( n6 T" I4 p
         * @param data  新data
    # b7 U/ ~/ Y" z4 q; j     * @return 旧data# }0 m& W, ?- R2 y7 D$ k
         */+ g% o. `1 y: P9 t
        public int set(int index, int data) {
    # |/ n# L# f% k- |1 y        Node x = get(index);9 G8 A) Q' C  O6 Z: z( ~9 W' `
            int oldVal = x.data;! Q! S6 e" W) g2 L" ?
            x.data = data;3 Q- G, y7 ]7 u6 K% Y- |
            return oldVal;
    . O/ b) d" F) N( r( A0 V    }
    - ~- v% v9 [3 ?4 \( A; W) B# r' O( s  D$ ?. }( ^; i( [
    3. 插入节点

    只要内存空间允许,能够插入链表的元素是无穷无尽的,不需要像数组那样考虑扩容的问题。

    与数组类似,链表插入节点时,同样分为3种情况。

    • 尾部插入
    • 头部插入
    • 中间插入# v- F/ }$ R. V' C. t1 P
    3.1. 尾部插入

    尾部插入,是最简单的情况,把最后一个节点的next指针指向新插入的节点即可。

    " M7 t2 t* p9 I# f
    6.png
    : Z0 A5 g$ N8 A1 @9 i3.2. 头部插入

    头部插入,可以分成两个步骤。

    • 第1步,把新节点的next指针指向原先的头节点。
    • 第2步,把新节点变为链表的头节点。
      0 H$ j& F! ^. ]8 }" E4 ~! }* i
    7.png ! L3 j' N7 y7 E9 S5 g  M; L
    - [7 e1 B" v+ _) S, v$ C+ f
    3.3. 中间插入

    中间插入,同样分为两个步骤。

    • 第1步,新节点的next指针,指向插入位置的节点。
    • 第2步,插入位置前置节点的next指针,指向新节点。' g7 K; m0 f8 S8 ]  N2 Q
    8.png " u& Z2 ?2 X) ?# |7 a( |& Q% y1 _% b

    0 x+ M+ J8 Q6 b三钟情况的代码合到一起! E* n6 H/ O8 R  y% v6 L9 `, b
    6 m6 T, \/ y, X" X- X
    /**
    ) _6 M& V* C) \4 o2 O     * 链表插入元素7 S9 S! H# M- g
         *
    4 d/ o; B9 F+ Q& L2 Y  l     * @param index 插入位置' y7 k/ A) i5 ^) e; S5 t# L, C
         * @param data  插入元素 被插入的链表节点的数据
    . f& F, X6 s7 U& U     */
    : X2 d3 }/ ^0 l' F1 @* t    public void insert(int index, int data) {
    / e0 `$ g) ~. H* `/ u% }        if (index < 0 || index > size) {' a6 d7 {- |# E3 ?5 r+ V
                throw new IndexOutOfBoundsException("超出链表节点范围!");5 z$ u/ Y/ E7 C( h8 n' w+ x
            }
    + D2 C4 {, p# `) f        Node insertedNode = new Node(data);8 r8 }/ ~! I! F4 u9 W
            if (size == 0) {
    4 f! `9 u6 T% w7 U( k            //空链表) F( Q1 e+ Y* ]* m
                head = insertedNode;8 I$ ?1 [4 r$ }8 A% e+ Z
                last = insertedNode;
    ' U0 i4 E. g% `' @- O8 O7 S        } else if (index == 0) {5 n4 ]6 C' m. L
                //插入头部
    ( c( Y2 E9 U) U. F. A; @6 P2 `            insertedNode.next = head;# g: Z: R, X$ R" R) ?: T! Y, a
                head = insertedNode;
    , s* _, |& y2 c        } else if (size == index) {/ {- F! d5 |! R2 k
                //插入尾部' _7 g  T' p# M; N: q6 H4 d* }
                last.next = insertedNode;8 y  O* u  X. l
                last = insertedNode;
    1 `5 `3 B( ^- x: y8 `" P0 ~- e        } else {
    , |+ ]( |2 ~+ b+ `, s0 N: c% ^            //插入中间+ F" f% e# G6 y
                Node prvNode = get(index - 1);
    - ^0 d4 _  p% g/ P5 e            insertedNode.next = prvNode.next;  L; e( L/ Q' z8 S0 G
                prvNode.next = insertedNode;- H2 Y* L; ~) |0 x2 p$ o. z
            }
    ; s) W  `+ @% O; N1 i        size++;, e5 O4 q2 i5 @2 ]7 t1 g
        }% k9 ?+ L+ E8 i9 [9 h* K( m! P

    8 m1 _4 g1 ?! g* G7 o1 B/**+ K; T7 ]. Z3 t% |' i
         * 链表插入元素# O: h) f7 z7 [# q$ H1 @  R2 K
         *
    9 j# k' w5 K7 k     * @param index 插入位置
    " Z6 U3 G. J; n! _     * @param data  插入元素 被插入的链表节点的数据
    0 l0 _8 j6 m; l( T( B     */7 f$ Q4 C+ x3 N4 F9 a7 c# I
        public void insert(int index, int data) {
    3 u' k% f+ D3 s* w0 L        if (index < 0 || index > size) {0 n0 K! ?/ J  h0 ]3 v; d
                throw new IndexOutOfBoundsException("超出链表节点范围!");
    ! ^/ }1 a7 \+ i7 P( B& a        }  e0 Q6 |( g4 y+ {/ O
            Node insertedNode = new Node(data);; R! A5 R. D; G0 L0 W
            if (size == 0) {: A; }8 l# i5 R( P/ ~! r
                //空链表. w1 O- [2 r) Y0 l6 ?; M0 R
                head = insertedNode;
    / j3 R' m8 \9 K6 H, g) A1 t! l7 V            last = insertedNode;0 }" u! m  e; N) k2 k7 L( g5 \7 u2 T
            } else if (index == 0) {
    * I5 n& e: B0 [$ R! W( E            //插入头部
    / L0 q2 h# ?0 w9 t: H! R            insertedNode.next = head;9 M2 ~) j4 k( p' K
                head = insertedNode;8 i& z2 \0 O* i) b) _
            } else if (size == index) {5 h; N3 v8 h# Z+ x9 K" l
                //插入尾部2 _& A1 Y% f! c
                last.next = insertedNode;
    $ p1 K: C3 V; z6 `  c3 S0 l            last = insertedNode;
    ; Y7 E- @1 k8 U7 L& _        } else {
    & K) W* E+ U2 \            //插入中间; _# {9 N( A% h9 X5 V# h8 [( J
                Node prvNode = get(index - 1);
    ! `" l" C' `  R            insertedNode.next = prvNode.next;. T- d0 Z  f( n# d8 f  s
                prvNode.next = insertedNode;
    & `! v4 d' ^9 K# t- G        }
    & f2 a8 A# }0 z! @6 j$ R        size++;
    : W: Q7 j2 e0 J) I# m    }
    ( O' _6 v6 @0 F8 \6 r5 y4. 删除元素

    链表的删除操作同样分为3种情况。

    • 尾部删除
    • 头部删除
    • 中间删除
      ( e8 o% E& l, B2 E0 g+ R6 X
    4.1. 尾部删除

    尾部删除,是最简单的情况,把倒数第2个节点的next指针指向空即
    / l7 K3 l- t  \: T; u! D# F  p可。

    9.png
    " X! ?3 e! W6 A8 A- s  D7 x0 J' g" ?7 A, h) T
    4.1. 头部删除

    头部删除,也很简单,把链表的头节点设为原先头节点的next指针即可。

    10.png
    + Z' D6 u3 F) m6 [, G: o7 x
    1 ?* Q% x' Q  y, U+ k4.1. 中间删除

    中间删除,同样很简单,把要删除节点的前置节点的next指针,指向要
    2 H% a1 O/ ]/ k9 ~$ x% A删除元素的下一个节点即可。

    11.png
    " o  Y" M5 [7 B, ~$ L: k4 _; k9 k: s7 {; E

    6 Z# d: F# \, Y5 k1 f这里需要注意的是,许多高级语言,如Java,拥有自动化的垃圾回收机制,所以我们不用刻意去释放被删除的节点,只要没有外部引用指向它们,被删除的节点会被自动回收。
    , t7 h0 |# X3 q% T如果不考虑插入、删除操作之前查找元素的过程,只考虑纯粹的插入和删除操作,时间复杂度都是O(1)
    3 J8 f$ [. G( A. i' A0 e/**
      G+ V+ w; x1 I     * 链表删除元素! l3 P4 O9 m0 P; O: ]( d
         *3 V# ]0 ?- R- O/ t
         * @param index 删除的位置. W3 H" v) O9 k+ [& E
         * @return 被删除的节点/ f+ e8 n% E8 g( ~: F! h* w9 M2 a  n7 L; P0 a
         */- W0 l% ]6 T" S" d. J
        public Node remove(int index) {
    & c7 D3 [# U: R        if (index < 0 || index > size) {( q# J1 y. Z! U% B  ]
                throw new IndexOutOfBoundsException("超出链表节点范围");
    ' o% v6 S6 r8 l; U, P$ K        }
    % D9 `* E) `6 I8 f+ k  c  f+ [        Node removeNode;. F! h  Z7 N$ S$ t7 W
            if (index == 0) {
    0 S% g, |, A' @8 `; ~* c: b            if (size == 0) {
    6 n& m" p; @, {) q  m' L3 i                throw new NullPointerException("当前链表为空,不可以进行删除操作");
    & l$ `! c% S! B& @7 ~( u/ V" G5 ]- i            }2 W9 }; T5 I- i5 V: R; j
                //删除头节点0 `' E7 l4 y8 M1 R# Q' d; X1 G7 u
                removeNode = head;9 W* O' ?8 u. {+ e3 W( S6 P
                head = head.next;
    # I! u+ ~* G4 Z, y# R- M& i% d        } else if (index == size - 1) {
    1 H9 Q) S: M0 |1 e$ K            //删除尾节点
    " c& t. o+ E; L- u, p            Node preNode = get(index - 1);
    $ B8 t! j% P9 t" t            removeNode = preNode.next;
    / k9 q5 K0 o( I+ e            preNode.next = null;  }# C6 p$ }) |
                last = preNode;9 s( x9 a/ }0 `" x3 M) w: _
            } else {# g/ _  C  ]  {  ~, h$ a
                //删除中间节点
    ! f4 U/ E+ n. e            Node prevNode = get(index - 1);0 F' |% U4 X6 E& T/ b9 H6 }$ i2 y
                removeNode = prevNode.next;
    ( [3 [" f1 `0 g# E* E- |            prevNode.next = prevNode.next.next;& i$ t. @% f7 q' W7 m) U' W# r' ?5 n
            }) O" k( P7 u6 m( |! E- A
            size--;
    ! C9 _) @/ e2 [0 [        return removeNode;  r0 o; O0 y5 S0 D! B" O
        }. V- u3 g( J$ x- w# M( h
    Java实现链表的完整代码package chapter2.part2;
      H# r% T$ M; L* b, y; L+ T5 f  m7 O+ K1 Q4 ?
    /**  N, [3 r7 H' C: {" Z% j! \
    * Created by IntelliJ IDEA.' E* h' }2 V5 P0 @. M
    *
    ! J+ e% J3 U1 X+ P$ f; A/ U6 K/ ]/ y * @Author: 张志浩  Zhang Zhihao" D& j) G  _/ y8 E5 O" P8 z" q
    * @Email: 3382885270@qq.com* b5 S1 v' e; i; j) I
    * @Date: 2020/5/3
    + i0 w5 G3 F5 x. a  g9 J" g * @Time: 13:39$ v+ Q6 h* j3 s) f
    * @Version: 1.06 [# J; W: T) \
    */
    3 ?1 W( u; i9 R8 apublic class MyLinkedList2 {2 Z7 Q& g3 H% s1 ?0 i
        private Node head; //头节点/ E1 b) r. n1 r, }- o
        private Node last; //尾节点9 S& ]3 o5 _$ R: u. a9 ]* y
        private int size; //链表实际长度; x9 v& ~0 [* j

    % ]' @! o/ ~5 x/ o* T9 }% o. g) e    public static void main(String[] args) {, Z! I3 E' I3 G% k8 r3 Z% f: s
            MyLinkedList2 myLinkedList = new MyLinkedList2();  B' F* c2 e( s8 K
    //        myLinkedList.remove(0); // java.lang.NullPointerException: 当前链表为空,不可以进行删除操作
    ( z  v, @9 |+ [+ F" Z2 x) \- B//        myLinkedList.remove(3); // java.lang.IndexOutOfBoundsException: 超出链表节点范围* h2 y* X! ^; J. I( R
            myLinkedList.insert(0, 3);
    7 D- z1 n2 C  j  b; G        myLinkedList.insert(1, 7);
    7 U* H( N+ ^6 e4 Z, f6 V* ?        myLinkedList.insert(2, 9);; \3 b5 m9 G# f, ?  S/ \8 Z
            myLinkedList.insert(3, 5);8 K& B; t( b" l0 u' h  Z+ a
            myLinkedList.insert(1, 6);/ ~- ?2 l( o) [2 z
            myLinkedList.remove(0);: O- \/ r( S6 L' W2 b) ]
            myLinkedList.set(0, 23);( J# E* a2 K1 U# ]5 J
            myLinkedList.output();
    / ^7 |0 ~, t! H, W1 |4 q& S    }
    " x1 K: [# S& _/ P( X% U3 C" e, p' }8 Y# z, J, Y
        /**4 G# w% Y4 y* f; f
         * 链表插入元素% A- [5 M9 c" H& ]) }# O. g  G
         *5 b1 v$ w$ U- A  y. S/ j
         * @param index 插入位置0 `( s3 x" O8 I9 n# ~
         * @param data  插入元素 被插入的链表节点的数据! K+ A5 |0 a  J$ F$ T! _" F
         */
    % n! e" J' P2 l  X) @5 p    public void insert(int index, int data) {
    " C! K3 l( Q5 F0 h        if (index < 0 || index > size) {; u9 A% \/ Z  y. w' @' P4 B
                throw new IndexOutOfBoundsException("超出链表节点范围!");
    + b5 E! F, e3 Y  _/ f        }$ z8 P4 h" W4 N6 M, Q
            Node insertedNode = new Node(data);
    ! w2 W- `( e3 J! a1 y        if (size == 0) {
    ; i# B7 L: Z$ q! m            //空链表9 i1 s/ j- Y! _
                head = insertedNode;
    6 W0 R- u( e0 _8 z5 Q' \            last = insertedNode;- r4 M4 [7 |8 h: H7 O- |+ k) L
            } else if (index == 0) {, o! n8 p, W9 [$ e8 N& x
                //插入头部
    $ Y5 M, ~) O+ v# l3 |            insertedNode.next = head;. ]' |5 R7 h, W! X1 B
                head = insertedNode;
    ( ^6 K/ ~( U7 \4 _  k% H& B. p/ T        } else if (size == index) {
    / n% K% b  j, Y- }$ D            //插入尾部
    * n% d! E$ B! ?            last.next = insertedNode;7 M5 c2 N9 e/ U$ O2 G
                last = insertedNode;% F8 N. q8 `/ h7 @6 Q2 ~
            } else {
    " w8 m% J) U+ P7 s            //插入中间, T( p' X$ x, U; W1 J6 d8 z8 h( V  r! h
                Node prvNode = get(index - 1);
    ! r% {: a: R& K9 E            insertedNode.next = prvNode.next;8 h2 b  q2 M0 t
                prvNode.next = insertedNode;
    * s1 b$ _% C7 L- S: Q" _$ W" Q" b  \        }$ L2 G/ b# s1 F2 ^! \) d
            size++;4 I/ u& J7 U- h. X, F
        }
    6 x7 N7 B7 _% `! Y1 T
    " e4 p! C; k# z0 U    /**
    5 S) V0 r8 I$ B* f3 L+ c. z     * 链表删除元素2 L' _, n) L% j1 q
         *
    0 B; c2 q& q( d7 o- C     * @param index 删除的位置$ ]- I  B- N7 _% e1 g
         * @return 被删除的节点# F  ^9 |9 a1 B0 P' q9 `' _
         */
    8 I: b- c+ [8 B1 N6 q8 R8 O/ A    public Node remove(int index) {) N1 ~/ A* y2 g' g& S3 w7 H) Y
            if (index < 0 || index > size) {, A: W+ o) J3 W& }3 S/ F2 Y) M
                throw new IndexOutOfBoundsException("超出链表节点范围");
    ( x2 i, y0 R! d6 D* f; c, t( [  l: r        }8 K2 p, P- P6 T" x" w
            Node removeNode;: `! @- z% v  T6 |1 ]9 l) U% O4 F; U
            if (index == 0) {
    * T# v' e, D& g6 g5 t1 E9 ?            if (size == 0) {0 U( o6 ?  |/ l% s4 n' s
                    throw new NullPointerException("当前链表为空,不可以进行删除操作");
    9 h4 S: \9 J# `0 z5 r            }+ q9 f: e( o+ w
                //删除头节点' {% i# P7 Y3 M8 |
                removeNode = head;
    6 g% b. z% n2 o% N0 p6 b            head = head.next;
    ! u4 K" F2 R6 ^; r& S5 j        } else if (index == size - 1) {. T3 R" ^9 w9 T) M% `- @
                //删除尾节点8 h0 P& j  x+ ?/ T9 U' ~8 r5 q
                Node preNode = get(index - 1);, t9 L7 ?+ `5 v4 {( P  h
                removeNode = preNode.next;3 _" ^0 m6 D- q. l4 I% O) V
                preNode.next = null;
    / o  W+ }& a3 ~            last = preNode;
    + J( ]3 \# H7 ~8 r        } else {; w# ~* N* x. a! T1 j. n5 Y) H# A; Z7 j
                //删除中间节点# i" [% G) U. _  b! N' Z
                Node prevNode = get(index - 1);
    3 q$ W" Y8 Y8 |8 W7 A            removeNode = prevNode.next;
    ! E4 s8 f9 x( b: l1 Y$ C            prevNode.next = prevNode.next.next;; f" n4 A7 q; @( F2 q
            }4 n0 j1 L2 C! J% `
            size--;
    ) l4 u' H7 y6 Z) W        return removeNode;3 f4 B, y) j  X0 u& w& o9 Z% K# M
        }  m5 E7 _% L# }- v
    , F& ^4 k! {0 t3 Y6 N( B
        /**: h% e3 B, i4 ?8 ^4 U6 h
         * 更新节点 将列表中指定位置的节点的data替换为指定的data。
    7 r" u" C& i) g$ T# I     *
    ; {. Y. D1 E7 m: r8 r; w$ x     * @param index 需要更新的节点的位置: r! _: z9 M, V  Q9 i, ]
         * @param data  新data
    6 R6 K" k; H' u! I" N$ G     * @return 旧data
    " s) Y1 W  J0 v* M" X6 u/ I     */
    ' U  M6 H6 Y7 ?    public int set(int index, int data) {
    ) h. Y. @4 _5 T  p, U9 |        Node x = get(index);
    / b! [) P" O: z; A        int oldVal = x.data;- q' d! \2 y& D
            x.data = data;% ?/ ?3 o. A- |0 F' U7 ?
            return oldVal;
    7 X. v8 U: E9 W# F% d2 m: o& S    }
    7 [1 q" x* s/ [# o6 v% h' s: m  M) I
        /**6 c, l2 i/ }  q  M& ^
         * 链表查找元素6 s6 G8 b0 R# g
         *
    0 B  M) ?' d. W& i- p, w     * @param index 查找的位置
    9 B6 H1 [3 M* A" J     * @return index位置的Node对象
    * E6 c  I$ _& o7 j     */
    ) z* C8 Y" g0 \6 ~- U, r    public Node get(int index) {5 j" ]  C/ b, [- e2 A( h7 W
            if (index < 0 || index > size) {
    # k- j- L3 h# c! d  r6 f            throw new IndexOutOfBoundsException("超出链表的节点的范围!");
    ' A) |6 n( [3 Q. V' U        }
      B, K0 A+ K# S9 z# \5 j# n        Node temp = head;
    ; g& Z3 c: Y' G8 ?% ?* E        for (int i = 0; i < index; i++) {4 w2 S3 U5 j4 \6 B% E. X
                temp = temp.next;
    : p0 ?6 r2 O7 d        }
    1 ~- h: B8 S& K$ k: A4 V! U        return temp;6 _5 O$ y1 D' I  [, j
        }1 W% o% t2 e# c: W" A

    2 j, j4 X$ v, g/ f2 h! H& n6 N    /**9 u  T1 b) f. H6 y7 h* W
         * 输出链表; i1 v; b  o; ]8 `' Q9 E: M
         */
      G/ A, I* _6 e7 j6 s2 q    public void output() {( o1 G; \$ `+ E9 ~+ a% p3 S
            Node temp = head;5 s& s$ z  E/ Y0 J1 v% b1 \9 |
            while (temp != null) {
    " e  z& @9 `8 p: ]) L& [1 C            System.out.print(temp.data + " ");" n7 M$ \4 W, P' d' L( h
                temp = temp.next;
    " K* P4 q7 u' {/ S  j/ L        }4 F- [! D, h  a- Z# a
        }# ^2 u* Y6 x$ M! O

    & B% Y0 q: w2 }1 I% s    /**
    ; [. L& |6 t: A5 Q3 J     * 链表节点
    3 m2 J" C) b$ F4 q) C: E     */4 r7 W3 g1 g4 D6 t% V6 T
        class Node {/ B2 a" d1 Q* D8 V  [% |, N
            int data;
    % j+ E, ~4 ^/ ]* q5 }        Node next;
    5 `( b- V2 m0 a# d! @4 t
    4 |' c" e% R/ @/ X1 J* h% p# {        Node(int data) {' Q) t% F2 U* D$ r- l4 T
                this.data = data;, e' L0 [1 p3 f
            }
      Z  C9 H$ ?8 O# |. K5 D4 f    }
    9 a& J6 [$ ~7 S+ B( }5 Q8 U& `+ t0 S}
    & b& u8 _$ e% s
    2 V% b. s% R6 U* }, n% ~4 J
    + w  h8 r) G7 A+ V9 C- p2 H6 e( X二、双向链表 12.png 6 e4 Q7 @5 K0 ]$ R# D7 K
    双向链表比单向链表稍微复杂一些,它的每一个节点除了拥有data和next指针,还拥有指向前置节点的prev 指针。' C: ^9 A1 F/ S2 J1 H6 B. d6 p) k

    6 q0 s, P  j& }; ~" J  {) _, p' L5 U
    1 q4 h# F4 q; t: r- H
    ' {' O: `) ?0 I% T  }' f9 b# \* V" T* O' v
    ————————————————
    ) F9 ]- |  p! T7 G* ?版权声明:本文为CSDN博主「爱做梦的鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ' ]* A/ p* ]# d% ?3 x. [" C( `' B原文链接:https://blog.csdn.net/weixin_43124279/article/details/105904468
    ' {% H8 e" q: B& j8 B$ N* @! O5 _9 h3 E7 n" e3 f9 M3 I% l3 M; O7 _

    5 l& ~9 ^3 u& `) a+ A/ E' f2 h, i

    2.png (256.36 KB, 下载次数: 245)

    2.png

    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-4-19 13:19 , Processed in 0.437652 second(s), 54 queries .

    回顶部