QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5190|回复: 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
    * m  W$ P; K( B: y* X  F) v0 @
    【Java演示】什么是链表?数据结构- `" v% U- |- J8 j
    一、单向链表
    3 o8 @3 t: H4 S4 x5 U. j5 H, S$ P+ p0 N9 @* r! f4 F
    1.png - F* P+ v9 N% v4 ]/ v% A3 f, f
    链表(linked list)是一种在物理上非连续、非顺序的数据结构,由若干节点(node)所组成。8 z. ^0 Z4 O/ E2 R
    单向 链表的每一个节点又包含两部分,一部分是存放数据的变量data,另一部分是指向下一个节点的指针next。0 b! A. c+ p' h
    链表的第1个节点被称为头节点,最后1个节点被称为尾节点,尾节点的next指针指向空。
    : D2 T: F: T" ?2 `; \4 N
    0 r. Z, m3 t/ |) H; T. H什么叫随机存储呢?
    . q. t7 x& G' o4 m( D6 d( ]
    4 ^5 f6 m+ f( h% O% k6 s如果说数组在内存中的存储方式是顺序存储,那么链表在内存中的存储方式则是随机存储 。
    7 z4 C' \0 ~, l" ~/ j上一节我们讲解了数组的内存分配方式,数组在内存中占用了连续完整的存储空间。而链表则采用了见缝插针的方式,链表的每一个节点分布在内存的不同位置,依靠next指针关联起来。这样可以灵活有效地利用零散的碎片空间。
    & ]9 F) C9 @5 c! c& S" _ 3.png
    ' j) {1 P3 p: M
    % b( m8 W8 _4 K* e

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

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

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

    4.png
      P' h0 |7 A( }) T& e6 c! I5 r3 ]2 c0 w
    /**
    2 K) [  ?: B2 z: ~& J' o: H$ e/ s8 _     * 链表查找元素6 S- C; u! F! I( B
         *% j, Z4 M( }2 z7 e6 M
         * @param index 查找的位置
    / m# W. V5 d( `: n6 A1 w     * @return index位置的Node对象
    6 a  O% Q4 D: f/ N/ I- F     */
    ' {7 R. P, [, z/ {    public Node get(int index) {
      S" I0 Q3 p* c) h$ f3 L. u        if (index < 0 || index > size) {! g+ A$ T( n6 W5 g/ D
                throw new IndexOutOfBoundsException("超出链表的节点的范围!");! x. j3 {7 Z% w" r- W7 Z- T- m
            }# M" @/ X( U( ~& d
            Node temp = head;' F% H# \" C7 n, p/ C* z" J4 F* O
            for (int i = 0; i < index; i++) {* Z0 Z2 @* `+ O, i+ L( @! _4 d, B$ Q
                temp = temp.next;
      Y" N& {, F. S$ ^  w" r        }
      w/ L' Q- _% \" j9 k        return temp;
    2 f9 k0 f& k5 l$ j3 d4 G: k9 J9 s    }# l, |, ^- H" B' K

    % D6 F; G  @8 B7 Z

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

    2. 更新节点 5.png ' N! I( ?, a  W

    1 d& T6 \( d0 B! K' R2 e& z如果不考虑查找节点的过程,链表的更新过程会像数组那样简单,直接把旧数据替换成新数据即可。
    6 G* p; ~# R4 }& r. s如果不考虑查找元素的过程,只考虑纯粹的更新节点操作,时间复杂度是O(1)
    . N: l, K- {7 n- l$ r3 _; z/**$ s. G; o/ G1 o2 S$ H8 Q5 f
         * 更新节点 将列表中指定位置的节点的data替换为指定的data。
    , v. e4 W  W# N6 V     *% y0 E4 j7 m1 q! E8 x
         * @param index 需要更新的节点的位置
    / F5 [  _  G5 x, _0 t4 Z     * @param data  新data, D0 d0 `2 c2 T4 {) {. Z0 n  p
         * @return 旧data
    / C- r3 F$ Y, }     */; Y+ X* O$ f6 B: x* Y, R
        public int set(int index, int data) {: K+ T9 n8 j1 g9 V3 M
            Node x = get(index);
    ' J, ~1 n1 g: P; G# l6 ?        int oldVal = x.data;6 a2 z  X+ A# e, F$ P/ X; p
            x.data = data;
    , |9 U' M  w+ Y4 f' y/ m0 {0 Z) A( x        return oldVal;0 _/ l* W6 `1 L& f2 {0 D" [7 I; u: L
        }
    / m( l# y; {: j, B- R( [) P4 B# t) Z' ?$ X$ q* o
    3. 插入节点

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

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

    • 尾部插入
    • 头部插入
    • 中间插入; A1 k! B1 [7 `+ x! h7 J; k
    3.1. 尾部插入

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


    2 {) l- x: w3 |1 Y4 ~8 q& t 6.png
    " t# x+ ~. e5 y3 j, g( ^! u  \6 Z3.2. 头部插入

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

    • 第1步,把新节点的next指针指向原先的头节点。
    • 第2步,把新节点变为链表的头节点。
      ) q' d- k/ w$ d0 z- C
    7.png - [5 M; ?  O! m1 y( r0 g) G
    7 s$ m! y5 E: w. M( |, L
    3.3. 中间插入

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

    • 第1步,新节点的next指针,指向插入位置的节点。
    • 第2步,插入位置前置节点的next指针,指向新节点。- o$ Y3 ~0 ?% R* i" x% B: q
    8.png 0 R& o; R$ `" Z# _4 T1 J" e. {
    $ R. V+ h( y( ~$ j' C' s
    三钟情况的代码合到一起; t  X, e# X  ]- \% w9 P2 H& K2 l

    " G* E9 q# U# [3 U4 Q  a% z/**
    ; e% h6 \% d2 y' \     * 链表插入元素
    3 f: c4 V7 z" M2 {     *# P2 p! N/ a$ C) }- [1 G) ^
         * @param index 插入位置( _) O) n. e; l, S
         * @param data  插入元素 被插入的链表节点的数据" l/ u4 B* {5 K/ q1 I! g+ v5 O: u
         */
    ) U  o* @7 m6 X; W    public void insert(int index, int data) {$ M9 }0 w% H+ \; _3 r
            if (index < 0 || index > size) {+ P1 U- }7 c. z& \3 }
                throw new IndexOutOfBoundsException("超出链表节点范围!");
    4 `6 D* [$ O* Y' \5 A: Z        }
    9 M5 ~) Y+ H; E- Q) w8 |0 k: e        Node insertedNode = new Node(data);
    ' C2 E' q. {' c        if (size == 0) {
    ) ^) }9 \9 P% U  x            //空链表
    " W$ A" w+ @2 p2 q) u2 U' s! P% `            head = insertedNode;
    ! \# R0 q9 U0 i' o0 f! y7 L            last = insertedNode;% I, ]1 _" l+ ^% M. L; f2 p2 t
            } else if (index == 0) {8 u( c& N- _* b' q9 ~3 j7 L6 t. q
                //插入头部/ C( `4 p7 y: ^% ~
                insertedNode.next = head;
    ; }0 i# A* V. ?2 \; I, s, `. t            head = insertedNode;; V: ]( F, O. c- K+ ~' H
            } else if (size == index) {% l  W) t5 A: V2 @
                //插入尾部+ b7 E$ S5 z. h/ j1 S3 h+ O
                last.next = insertedNode;) p- L% n' D, k1 G: x
                last = insertedNode;. |$ P2 Y5 }* ^/ ]" N6 t: B
            } else {
    & X0 X% B3 I7 F0 j4 M            //插入中间0 v' v+ m$ U1 B' Z3 j2 j" v; h3 A# t, {
                Node prvNode = get(index - 1);
    + o+ W/ U1 w+ Z9 A  l            insertedNode.next = prvNode.next;( j9 `" U/ n' |$ r% n
                prvNode.next = insertedNode;
      y1 f$ ]% N; U& w& n        }" \# m& Y7 h9 L- l, R( g& L
            size++;
    2 L4 H; g- z+ L2 J    }' b1 r4 v/ R) S
    5 M/ P' ~  Q' D! K) A1 [& k+ q
    /**
    : n$ d1 j' ~; @- U" A" Y     * 链表插入元素' H3 ]0 m, B4 Y1 B. ~( ~
         *
    & [8 d$ W, c2 Z) Q2 k     * @param index 插入位置
    6 j4 q  s6 T6 m$ \     * @param data  插入元素 被插入的链表节点的数据* N2 i2 _& M6 r, p
         */
    ! z$ B# d! n3 h! c" e3 c7 j    public void insert(int index, int data) {1 A# i! F8 U/ \) X* d  ]
            if (index < 0 || index > size) {
    % i: M" }0 _& u& X3 E4 E            throw new IndexOutOfBoundsException("超出链表节点范围!");$ j  L0 Y0 J4 |# I
            }
    - [; I$ v5 v0 y2 q0 @        Node insertedNode = new Node(data);! Y0 }* L3 {( `: d
            if (size == 0) {/ h3 Y& }. f; H5 Z
                //空链表7 v1 j$ a$ L2 C8 r+ W! h
                head = insertedNode;; C. B  y: C0 j" k9 H6 r
                last = insertedNode;
    5 v  c5 k1 N  s# F        } else if (index == 0) {
    5 w! l) p7 E% [            //插入头部0 V. f9 C8 }: w& B/ f7 z; ]
                insertedNode.next = head;. z& M+ `8 w( M$ b2 }1 Y
                head = insertedNode;- p, I/ J) p! A0 S
            } else if (size == index) {
    5 v% _- G" u) g/ S8 ~9 C; h            //插入尾部
    8 W3 n% v1 u3 T0 M: C- R            last.next = insertedNode;
    4 ]* c1 e/ @4 O            last = insertedNode;
    & M4 l; G. D, ~5 w1 p        } else {8 X# n/ b% X& K8 R  \
                //插入中间
    3 I' P) D+ o$ ]            Node prvNode = get(index - 1);
    6 U) s: C! ]9 O6 y; j! D8 b/ y; ^2 _            insertedNode.next = prvNode.next;
    ' R+ z( ~" Y" B: W4 y4 o            prvNode.next = insertedNode;7 \# T0 l4 }/ W! J/ \
            }  C; P; ~7 i  j3 Z
            size++;: s; v' G. X# t! y3 S( ?
        }
    ! c- d2 {$ U# c  ?1 q4. 删除元素

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

    • 尾部删除
    • 头部删除
    • 中间删除
      6 F: f" Q" v/ V& z+ s
    4.1. 尾部删除

    尾部删除,是最简单的情况,把倒数第2个节点的next指针指向空即$ o# t/ {' j4 c( d& W" B
    可。

    9.png / q9 i" u, K4 r5 G5 M

    3 _6 u+ R1 U, r' N* Z) X4.1. 头部删除

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

    10.png
    , K! f7 H7 b  e* t; Y! R$ {9 X
    $ q3 k: l: L  R) D5 q, C9 g4.1. 中间删除

    中间删除,同样很简单,把要删除节点的前置节点的next指针,指向要
    6 x  `% A4 x9 k2 t( {' U0 _删除元素的下一个节点即可。

    11.png 8 [" g: ?2 E4 Q" W0 N
    ) q0 j! I% Q+ K1 R
    - b$ ]5 @* {% v
    这里需要注意的是,许多高级语言,如Java,拥有自动化的垃圾回收机制,所以我们不用刻意去释放被删除的节点,只要没有外部引用指向它们,被删除的节点会被自动回收。' E$ C* {# J1 e+ g
    如果不考虑插入、删除操作之前查找元素的过程,只考虑纯粹的插入和删除操作,时间复杂度都是O(1)
    : F1 V- h' A! @* B" }/**" `2 o: r1 |* @4 h1 {9 W- N
         * 链表删除元素
    . n( W  W/ j8 j& d5 X$ J6 D8 Z     *
    3 b* \6 B4 R8 x0 I, g% L     * @param index 删除的位置! o9 |3 l+ P- S3 U3 M9 H
         * @return 被删除的节点& t/ d  q1 U( [/ i( r: V
         */
    " N  d) D2 V) m; o' h' q    public Node remove(int index) {' ^) b! R7 v  ?1 q
            if (index < 0 || index > size) {
    ; k: s- M+ B/ v. \6 h; ^7 F, a* r  b            throw new IndexOutOfBoundsException("超出链表节点范围");
    + v+ E7 \% `$ U; V9 R        }
    ; B7 }( K  y( P6 t9 \& t        Node removeNode;
    * U9 R+ \; L2 S2 w        if (index == 0) {: w2 x5 D8 H* Q+ |3 X7 l
                if (size == 0) {1 o8 Q# J, ?% ]' O
                    throw new NullPointerException("当前链表为空,不可以进行删除操作");" g) E2 {  C7 _6 C
                }
    ( F7 k: I9 ~- Q$ g; h2 D" _# y            //删除头节点
    4 G- o$ P5 l/ i6 K9 H. m+ c7 `            removeNode = head;" U% I; g2 p- M: J4 E, Y+ P
                head = head.next;; |8 z6 o) u! p$ K" D
            } else if (index == size - 1) {3 v8 l: S* V/ i7 z7 A
                //删除尾节点
    / b2 q+ z/ _( N* _3 X1 g( {            Node preNode = get(index - 1);
    8 ], g/ R7 B( O) q4 Z: l- z! L            removeNode = preNode.next;
    , u' @3 {: a0 o, p8 \            preNode.next = null;1 F& @* [9 Q! ~( p
                last = preNode;/ w0 i5 D/ W& @
            } else {
    2 j. H& o$ |7 Z! N( |            //删除中间节点
    ; w( _* A: M$ y7 E* _/ Y            Node prevNode = get(index - 1);
    $ K/ \. t$ z5 \- G* _& c            removeNode = prevNode.next;7 K& w- L% t' H5 M6 |) m
                prevNode.next = prevNode.next.next;  l; Q. g' [7 ~5 o0 k
            }8 c' D5 E" E! U2 o/ u) \4 M
            size--;4 E$ o! n+ i0 |! o
            return removeNode;! d: d: l8 u& }. x
        }- P4 K- u) O6 r& `* t
    Java实现链表的完整代码package chapter2.part2;
    & _' M: I3 I  [3 E. m% x
    ( l/ L" o) H1 J6 c% @0 Z/**
    4 t# T2 \$ |" A: b * Created by IntelliJ IDEA.* s' |* Z8 F) m2 {7 V, b. x; Y& S3 u
    *- r8 j' e, B: S" d' U, S  {$ g' ~
    * @Author: 张志浩  Zhang Zhihao: z0 a3 q' q2 J/ _! w( m; k
    * @Email: 3382885270@qq.com
    , d* w* ?5 N+ [7 W& C * @Date: 2020/5/31 ?! o8 X: _) I3 j' }. l
    * @Time: 13:395 q0 E/ `; ~) ~3 ]8 i* I
    * @Version: 1.0) q, `) I1 Q1 P$ w" k; h2 t6 j
    */
    ) H6 Q9 {+ R" V6 Ppublic class MyLinkedList2 {
    # H8 J4 u" N' E; r0 [    private Node head; //头节点
    " e% R# h6 u: _( [- [' H    private Node last; //尾节点
      Q  F0 ?5 d% g2 K% R* |    private int size; //链表实际长度
    - z, b7 {% }7 m2 a  o' H: G8 R7 m% F: j. Z5 Z6 Q
        public static void main(String[] args) {, l3 }1 t1 ]/ S6 T: M0 k5 Y: @' P, t4 k
            MyLinkedList2 myLinkedList = new MyLinkedList2();: [4 A1 [) s9 U3 s* b( j
    //        myLinkedList.remove(0); // java.lang.NullPointerException: 当前链表为空,不可以进行删除操作
    ; `, h( E3 C# J//        myLinkedList.remove(3); // java.lang.IndexOutOfBoundsException: 超出链表节点范围# v% [4 [8 M/ A1 x
            myLinkedList.insert(0, 3);  t5 t4 A& e4 n4 S' n( ?
            myLinkedList.insert(1, 7);
    # E% X+ b) ~- g        myLinkedList.insert(2, 9);
    7 ~- A, _) }; k% j        myLinkedList.insert(3, 5);+ y/ M, |% \& V: ?- \8 G/ W; Q
            myLinkedList.insert(1, 6);3 j: [4 g+ _4 p: j
            myLinkedList.remove(0);
    " @6 u, r; C5 @' _: a; Q9 Z1 q        myLinkedList.set(0, 23);' H! e  P2 _% K
            myLinkedList.output();
    0 U$ t$ K8 D( f/ p    }
    # L& W* v% y% R$ `- W
    5 W) m8 m3 E5 u% T    /**# \( H" R$ B, {8 `- L
         * 链表插入元素
    2 z( {3 n! j; M6 \3 v. t- O     *# B. I% m8 [2 z7 {) q
         * @param index 插入位置$ }9 Y$ N" c$ r) ^1 ~4 B0 W  g
         * @param data  插入元素 被插入的链表节点的数据; R) f3 Q/ I6 I7 K* r; Y5 _8 m' J
         */, W2 w8 E: ?5 f4 k' }: K, Y& k
        public void insert(int index, int data) {
    / L# r# h. Q- N2 d" N  ?% D        if (index < 0 || index > size) {. J4 p3 e: v* p5 k" p. F% @
                throw new IndexOutOfBoundsException("超出链表节点范围!");7 ]- H$ x3 g0 }
            }
    ' @7 W) o7 _) ~+ ~        Node insertedNode = new Node(data);7 H8 n1 C. L+ V6 W8 u# h( s
            if (size == 0) {
    7 c4 S! v* o* h& z- l& _+ D) A            //空链表
    6 w$ E/ ]: j) ^  C) r            head = insertedNode;& t7 a. C+ a. C+ Z- Q
                last = insertedNode;- g* B8 }8 {. s2 n$ h
            } else if (index == 0) {
    & E/ a; f% l8 W) m. g( C% Y            //插入头部1 O4 d0 c3 [; F
                insertedNode.next = head;
    7 I" e& B, a5 A- H! ~            head = insertedNode;
    7 \. E/ v8 U. n. e& R1 C- P        } else if (size == index) {- a) Y+ Y, i6 ^6 k
                //插入尾部3 m! X0 v% R" s: L' I
                last.next = insertedNode;
    4 J) k5 l. p6 p* x5 c9 n            last = insertedNode;, X& M7 Y# D2 `% l4 n
            } else {
    8 H, T0 m/ {0 e* _/ z, |. s            //插入中间
    6 \; d0 M1 T4 u+ n  [  X+ K! G3 l            Node prvNode = get(index - 1);8 I& Y# B2 b% J( N
                insertedNode.next = prvNode.next;
    9 M" k+ X, d% U* R7 x" \            prvNode.next = insertedNode;. B9 \: m, ~6 [8 |0 H$ s7 w6 g7 Y3 w* d  r
            }& w; r. R8 @: d7 y7 Z1 n6 ]
            size++;4 K4 S! U! z  x: a
        }
    3 s8 D0 X% M. F; u
    2 W: o3 [: V8 I% h    /**
    " y7 ?; P1 m' k* o( ]3 ^* V     * 链表删除元素
      K9 v3 p5 \# R5 ]* ?( k* b     *- I  X* z5 x- d" W$ [& m
         * @param index 删除的位置
    ! t/ v' f. `) j) W$ b     * @return 被删除的节点+ X! U0 W- F9 q0 X
         */
    * b/ A* P! Y  A. j/ K    public Node remove(int index) {
    # p6 X/ S7 i! d) a; ~. f) b2 E4 [        if (index < 0 || index > size) {
    * v0 w+ V9 `2 E. w& I            throw new IndexOutOfBoundsException("超出链表节点范围");
    7 j/ C3 K: m, {+ a- O" n2 T        }
    ) W3 R8 ^0 |% Z0 k  _/ \        Node removeNode;3 G1 x. w1 I- K* D# `) }
            if (index == 0) {
    8 J2 O5 L; r+ Q, u4 T7 o            if (size == 0) {+ ]5 L8 v; j; j' O, B
                    throw new NullPointerException("当前链表为空,不可以进行删除操作");/ I5 N( f, ]3 H" P7 v' E% q
                }7 v  V" t- [( q9 x
                //删除头节点( y3 M6 a8 w; X8 U0 ?- n4 U
                removeNode = head;$ O/ T; z. ?7 R  a9 ~
                head = head.next;. ?. L, p9 K$ P+ z5 E  H  I. u' `$ M
            } else if (index == size - 1) {' I( V* F% P" C: G# f
                //删除尾节点
    / T6 V2 E# f0 s+ m% e& o            Node preNode = get(index - 1);
    - n/ S5 t/ z+ l, Z            removeNode = preNode.next;6 b+ {: Z) X/ X1 W2 f
                preNode.next = null;7 e, c$ N# r9 U9 c2 W
                last = preNode;
    , y1 }" D$ l1 M" t4 Z        } else {
    ( M4 G/ l8 E: K6 G            //删除中间节点
      i) X9 J; X8 }, x0 L2 X4 X' W8 @& e            Node prevNode = get(index - 1);& [5 i/ B3 R4 {# |7 P) W
                removeNode = prevNode.next;8 o; U8 _( B8 L
                prevNode.next = prevNode.next.next;: ]# Y4 [. I. `! H) k4 Y7 s
            }
    # K$ p3 O* G& z& s        size--;
    : o: B# b8 D( }1 m9 ^        return removeNode;! @8 L2 n( i' Q! {- Z) n0 i- d
        }
    ' D6 c/ ^& Y$ y0 N- c; n( W  r7 J8 |" |
        /**
    ( Q7 L0 Y# |1 n     * 更新节点 将列表中指定位置的节点的data替换为指定的data。
    " I9 j% @5 a) R     *
    7 s$ p3 X- o7 C: v- N     * @param index 需要更新的节点的位置- \) b3 l9 A& S! M7 V$ k
         * @param data  新data: p2 X  c7 z8 P- \  @1 {
         * @return 旧data7 |4 B8 T- y  a2 h$ V3 f
         */7 V' j: {& v: O6 a! `
        public int set(int index, int data) {
    - V: k# f1 _3 I4 [# e/ ?        Node x = get(index);
    # U7 p  Z1 {, c2 {        int oldVal = x.data;
    5 v, D: m: K4 _1 a2 A4 c1 [        x.data = data;# v+ ^, q* h. S
            return oldVal;4 I8 b9 r6 V5 x% A: V" w  [
        }
    ) n; _0 \7 _3 N# y; O# {$ k+ `- S  x+ f% ^
        /**$ s4 [  o" `. C( o) f
         * 链表查找元素! d# ^$ G1 |% m) h7 L, J* r7 C( T
         *6 {& T- m+ D6 @! T& h( d3 |$ d
         * @param index 查找的位置
    2 K2 o- E9 u$ [+ r3 `$ f; _     * @return index位置的Node对象: \4 s% \3 p# F; o; x8 l
         */0 k2 I$ {" f) V+ l
        public Node get(int index) {
    5 N  E  a8 g# P) o. |$ \        if (index < 0 || index > size) {7 E: G8 W0 r/ W" K$ ]
                throw new IndexOutOfBoundsException("超出链表的节点的范围!");$ V6 U1 p0 @: A
            }! h8 _1 p; J5 c$ F: A0 B
            Node temp = head;
    3 Q" x( d- i4 h- v& G- V1 V3 V        for (int i = 0; i < index; i++) {' t2 _7 W2 Y! y! `
                temp = temp.next;3 `. V* E, c% T3 t2 W& j; y. w
            }
    4 @3 u9 [$ V& w- u+ C4 @        return temp;- R! l# J3 Q! Z. I; B
        }
    : P' @% L! n& n
    # A! r& B5 x6 K- H& s    /**
    9 {) A# t  I  s/ T8 Q     * 输出链表
    " g8 f- V5 }; F$ i     */: G! r, l% D7 X/ B& g7 U
        public void output() {" {, i# G+ t2 a; q
            Node temp = head;
    : V1 G$ C$ g' J0 t5 k        while (temp != null) {
    ! e, S" c  s4 o5 G, o            System.out.print(temp.data + " ");  l9 z3 e7 y9 ]! Y) Y
                temp = temp.next;; l. J$ O7 t0 k2 |5 p& x
            }
    % F: _& N  [5 Y    }
    # ?' T( V+ H0 r5 Y# t" _' r. z2 D  C7 c1 |1 ^
        /**
    ' b, _9 b* i3 r7 F     * 链表节点
    4 V. B/ a* E5 @     */, C/ ?: s0 Y& {% s3 C; E! u
        class Node {3 c( Y2 d& H4 q  G" d- q
            int data;
    . d. F4 m4 z! _2 b% a: h  T        Node next;, v3 ?8 G6 ]. }+ m% _4 n( p$ {2 Y* x' o
    2 z5 l7 w3 ?6 B* L* N% X+ R* W  `
            Node(int data) {" q$ F# y+ C1 B( L$ l) _
                this.data = data;7 ~) z: N- [7 e1 _. M( p) o* c2 z' T
            }  R2 v3 K# z7 R/ n
        }4 o; `# f- e& U( \% Y8 D& F
    }
    ( K# u6 d  k# b  o
    ) W' p3 W9 M9 c: f9 Q& Z2 n8 o4 n
    " h8 U; O6 e' C9 A1 N0 O; k  u二、双向链表 12.png " r& a3 ]: Q$ n, ]  z
    双向链表比单向链表稍微复杂一些,它的每一个节点除了拥有data和next指针,还拥有指向前置节点的prev 指针。: Z- w: y; B" H
    . g* d( m3 ?! U: \6 N- q+ J
    - n& e4 F1 z% n# L' Z

    ( n! t  D, b. w* r0 U$ b: C. U+ o0 }* c! o4 R
    ————————————————
    1 q" ~9 C  R. L: M. f版权声明:本文为CSDN博主「爱做梦的鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    + z9 P. s6 n% d6 X, F( ^原文链接:https://blog.csdn.net/weixin_43124279/article/details/105904468
    6 i4 f0 J. y  k, ~! _9 v/ D) W6 M+ N4 N" y4 D' \. Q5 x
    9 R, g' n" S0 O, P; a0 A

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

    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-6-14 23:26 , Processed in 0.619963 second(s), 54 queries .

    回顶部