QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4717|回复: 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
    6 q& J) X, C7 L8 Y6 `- B
    【Java演示】什么是链表?数据结构
    / a* ]) Y7 B1 x( u5 h一、单向链表& e! G) G3 i7 ?8 e

    & j- M/ n% N  d4 O. c! S: Y( H3 n 1.png # V, y5 ~9 s/ n- t* a4 H! _, t' d
    链表(linked list)是一种在物理上非连续、非顺序的数据结构,由若干节点(node)所组成。4 `9 V, w+ p8 M/ \3 D  R- @
    单向 链表的每一个节点又包含两部分,一部分是存放数据的变量data,另一部分是指向下一个节点的指针next。
    , T2 ~  O1 O1 E' i- c链表的第1个节点被称为头节点,最后1个节点被称为尾节点,尾节点的next指针指向空。
    - G; {' A7 Q$ }. g+ q, b3 X8 ?" `. D- G. N% A
    什么叫随机存储呢?) O' `, q; W* r: O1 n0 p. v
    ( \& t- K0 f2 v. p+ [
    如果说数组在内存中的存储方式是顺序存储,那么链表在内存中的存储方式则是随机存储 。
    3 H- o- X& [- E$ K! q3 D/ i& j上一节我们讲解了数组的内存分配方式,数组在内存中占用了连续完整的存储空间。而链表则采用了见缝插针的方式,链表的每一个节点分布在内存的不同位置,依靠next指针关联起来。这样可以灵活有效地利用零散的碎片空间。/ p; A, }; z# i+ c2 i5 c
    3.png " T- `: u- L+ E4 ^; d; L
    ( O& G! K. C) B# B* _; c% ?

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

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

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

    4.png 8 s  d6 ~: s, c0 U

    . H' b1 d% r0 b0 u& k' k% h% H$ x/**4 `+ o% K  Y. L8 Q+ S8 e: s4 c
         * 链表查找元素0 v/ I9 `, O! ?# f+ D
         *" b0 U! t( ?( P% b& W
         * @param index 查找的位置5 Q7 J8 b5 ]8 }. M9 G
         * @return index位置的Node对象
    " S; M; Q9 U8 Y* W     */, q0 H8 ?& U9 X% l- D$ r
        public Node get(int index) {
    : v  a- ~0 o0 G7 \: f- }% u        if (index < 0 || index > size) {
    8 G' _. r6 N$ F& @: N8 g            throw new IndexOutOfBoundsException("超出链表的节点的范围!");
    # Y3 F6 h8 l: F" l9 @        }2 y8 q6 x4 y- b  s; B% v! X& l  A% C
            Node temp = head;
    ! u# h0 p% w# d) E8 m  n. M        for (int i = 0; i < index; i++) {
    5 W" U' @. B  Q; v            temp = temp.next;
    4 ~0 a7 {) r) Y( M1 p: E* n) i        }" f/ B7 B, Z, y/ u; \' X0 u5 ~' m* \) R
            return temp;
    - @8 F+ Y4 O0 p    }
    / q, L  i' {; s* S4 _
    . l2 t- c0 s4 }' M& J

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

    2. 更新节点 5.png + V" v3 j& {' E  @/ B, H! l
    & Q* f; m* x5 G. K) n1 j
    如果不考虑查找节点的过程,链表的更新过程会像数组那样简单,直接把旧数据替换成新数据即可。, ?3 y0 ]/ C0 u0 n6 a% w
    如果不考虑查找元素的过程,只考虑纯粹的更新节点操作,时间复杂度是O(1)
    + X5 a% Z& J$ W% \) P/**& p/ k3 Y9 I8 _" R+ \7 h1 r7 o
         * 更新节点 将列表中指定位置的节点的data替换为指定的data。( O+ A7 |/ L2 t" X+ t( x5 f# L+ w
         *
    . T) B! h9 A6 r2 [$ i- G( l& ]     * @param index 需要更新的节点的位置$ ^- {$ V) v" O, ^* U7 v8 B
         * @param data  新data/ r" z& [, [8 ~. y& |
         * @return 旧data6 O0 A3 n7 V* u+ ]
         */4 ~2 ?" c4 [8 k$ G& Y
        public int set(int index, int data) {
    : P! P4 ?" l5 U9 N; ]" D/ A4 c        Node x = get(index);
    ; t. g. v7 P1 D1 t% ]        int oldVal = x.data;* k. g. ~( Q' Y- \+ H4 h
            x.data = data;0 K8 {" W9 r; {
            return oldVal;
    8 v) ~) e: R( {    }
    ) G; o- J" Q* R4 K" G2 a% B: E) Z; F) G) c0 O
    3. 插入节点

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

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

    • 尾部插入
    • 头部插入
    • 中间插入
      / r3 w) l7 K5 N1 m# b! z
    3.1. 尾部插入

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

    , L0 N; _) k- }. }( t
    6.png / L! E! z# g$ G  I* z3 k6 x
    3.2. 头部插入

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

    • 第1步,把新节点的next指针指向原先的头节点。
    • 第2步,把新节点变为链表的头节点。
      / s8 Q. U/ [, b* q
    7.png
    7 d, ~5 T: n7 t6 ^. T+ p
    - }7 X0 V- V. p7 ^' Y- U. Y3.3. 中间插入

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

    • 第1步,新节点的next指针,指向插入位置的节点。
    • 第2步,插入位置前置节点的next指针,指向新节点。- M9 ~4 V( a2 L# [0 v, R) Y
    8.png
    6 `! \" ]* a2 q3 R2 S6 d- f. q" Y7 T( h6 t: D2 F
    三钟情况的代码合到一起
    . {% g0 V" }: i, A7 F7 a: T' {
    9 p' [3 _+ z# i* V8 h* n/**
    % g, @* a# r5 n: s) u     * 链表插入元素7 t6 H2 M0 p# f* l6 q
         *
      `. i7 \* G; Q$ q! M     * @param index 插入位置
    0 Y- j. R' B) D& p; n     * @param data  插入元素 被插入的链表节点的数据$ C& h9 b) X" \' t
         */9 \* [2 T$ h1 c3 a, L  c5 G
        public void insert(int index, int data) {  E; _+ `/ X  Q% S
            if (index < 0 || index > size) {- J- C/ c2 V( M: I1 o- N
                throw new IndexOutOfBoundsException("超出链表节点范围!");+ I# j# g4 K2 R; z% a
            }7 n8 W: ]7 s+ I1 W/ k: q- d& p
            Node insertedNode = new Node(data);- u& R! i! h! F: S0 W( N, B/ x0 \! `
            if (size == 0) {$ g( b, U5 O. a) p: }
                //空链表0 ?6 P  |) P2 E6 w
                head = insertedNode;
    ; s1 b5 C7 L# P+ I/ f! C' H            last = insertedNode;1 y; B6 z2 G+ e( ~7 [) \% J/ z4 J
            } else if (index == 0) {( s4 U4 u5 k5 f* P# d7 B4 T
                //插入头部8 R% M( [% }8 `6 x8 o& \& V) ^
                insertedNode.next = head;2 G. X2 A$ X4 P3 g! @2 ?. o3 B9 [
                head = insertedNode;
    ; z# t& I* S* \1 Z4 e! |        } else if (size == index) {. k, |* T! m0 D* ~3 n( w! l4 k9 E
                //插入尾部& [, _; O! F5 }# k/ i
                last.next = insertedNode;) h+ W% Z0 b! Z4 b
                last = insertedNode;
    + \/ a, `6 V  a( ]4 `        } else {  k$ ~- p+ T/ @" T- R! N# v
                //插入中间
    - C! M- z' Y" [: t" V( K            Node prvNode = get(index - 1);
    3 \/ o" o: Y/ C* v7 q            insertedNode.next = prvNode.next;: P' y9 J: R' B% ]% ~4 |$ f2 h$ m
                prvNode.next = insertedNode;7 w! ?; U* {2 [3 }: h
            }2 @  U3 ]* I7 F& F2 ^9 g6 M, S% _
            size++;
    , L3 h4 O! \! F& T    }5 L8 G3 V! h+ q0 S: n" H6 K
    " m( c8 S0 P: o3 a6 ?- K
    /**
    ) t8 t2 A+ c9 [, y1 j4 Y9 ]0 T     * 链表插入元素
      f3 A  O( C. M0 |  L+ A     *
    ! Q+ \' g1 Y$ R! {     * @param index 插入位置6 u9 r6 g% g- V6 i0 D% r  n
         * @param data  插入元素 被插入的链表节点的数据. @3 E' L0 K1 O& [" T5 C  v; W- V
         */
    * W- w7 \& \& X/ M7 |4 S6 k    public void insert(int index, int data) {
    4 I( ?  R, }( ^        if (index < 0 || index > size) {# o) R$ |9 d# E: F3 M  A  R
                throw new IndexOutOfBoundsException("超出链表节点范围!");3 ^9 R, m5 D: B6 T- x+ d
            }2 G( r& X2 G$ g/ Z
            Node insertedNode = new Node(data);7 t8 }  Y+ F9 u, @
            if (size == 0) {* ?) w* |9 m) _0 N" w* L
                //空链表
    & X+ J6 c* a# `: e: @            head = insertedNode;
    ' M$ a4 c+ r" S            last = insertedNode;
    + r2 @9 c7 U% k. W% ?9 w' _        } else if (index == 0) {6 f' e) v4 J+ a6 U+ n, M
                //插入头部. `) V9 g# E. U* ?
                insertedNode.next = head;0 d7 h$ n: @0 h6 J* C0 T
                head = insertedNode;+ w9 B( F* Q4 P% V& i% w
            } else if (size == index) {/ ]1 T3 j* R* O7 b
                //插入尾部
    ( D- T4 e1 F; C0 }& O! O4 h9 Y0 H            last.next = insertedNode;
    8 ^% ]+ p- r+ M$ @- o            last = insertedNode;
    " r) j8 u) V# U4 i" t7 v5 I        } else {
      T5 x- w9 f. H            //插入中间. j/ Q: ^" y% p9 h, ~9 A/ D
                Node prvNode = get(index - 1);
    - T# o/ U! _& [6 d/ s( w+ E            insertedNode.next = prvNode.next;, R- q6 I' I* u0 d. x" Y
                prvNode.next = insertedNode;
    ; W; ^. s9 B$ V4 D5 c        }9 m) D1 f) m) s7 ~* g
            size++;' R% k, C' l) l5 G7 N; F3 ~( Y
        }0 A; J% Q2 t+ @7 y+ y9 M9 [
    4. 删除元素

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

    • 尾部删除
    • 头部删除
    • 中间删除
      - w) L+ X0 h" r5 r9 ?
    4.1. 尾部删除

    尾部删除,是最简单的情况,把倒数第2个节点的next指针指向空即
    ' A% H2 i: i  B* A. V& _  k可。

    9.png 5 C+ i& P: l: A& j: j9 E5 `& A: r
    & ~/ x+ O" v1 E7 u- A9 x8 Q  H4 ~" x
    4.1. 头部删除

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

    10.png " X+ N' T8 R0 ?( w. n9 J

    1 h/ v( M# `: ^0 T0 p- a! \  B4.1. 中间删除

    中间删除,同样很简单,把要删除节点的前置节点的next指针,指向要4 P, C* |& f1 F9 N- P/ l! o
    删除元素的下一个节点即可。

    11.png
    ( w/ b2 K7 N* Y7 g$ X) T/ E  e& ?5 N9 b4 @6 N( M
    0 s. Z* J. T- S9 E# |  t; h
    这里需要注意的是,许多高级语言,如Java,拥有自动化的垃圾回收机制,所以我们不用刻意去释放被删除的节点,只要没有外部引用指向它们,被删除的节点会被自动回收。
    $ L  s0 E2 v" n+ E/ z9 Z7 B- ^如果不考虑插入、删除操作之前查找元素的过程,只考虑纯粹的插入和删除操作,时间复杂度都是O(1)$ ?, O, `6 Z$ [  O' o( A
    /**% t8 [$ k0 R, J" V
         * 链表删除元素
    6 G+ D/ J- H' _% E' ?     *
    9 r& w9 O% r( q- d; R  Q     * @param index 删除的位置1 C  ^% X6 q" J' L( u
         * @return 被删除的节点: b" c( h$ D! N4 b
         */& n( p+ J3 B. G
        public Node remove(int index) {, q6 L, W% D4 n6 U3 t. c* m- v( F- m0 V
            if (index < 0 || index > size) {
    % w0 t  M. Y9 I* O8 ^6 V            throw new IndexOutOfBoundsException("超出链表节点范围");  ?( J/ r3 U) p; h
            }9 W) A2 h8 l9 G/ F$ ^  V: N3 C
            Node removeNode;
    ! M. ?2 r( W7 _; v        if (index == 0) {0 J5 Q* o3 f3 y# p' |- S
                if (size == 0) {+ R6 q$ E0 n/ [
                    throw new NullPointerException("当前链表为空,不可以进行删除操作");
    ! v0 K  n$ e$ O& n7 E8 Y            }
    + e0 C3 O  F  r4 f            //删除头节点: g7 @8 y0 d/ P" b! v
                removeNode = head;% C! y$ f9 o: w/ E" H
                head = head.next;4 ?; M4 ^4 X& E
            } else if (index == size - 1) {
    & j! [: M! A, q" W9 X; d            //删除尾节点
    - j( i/ m; ^: U7 [. r0 K3 J            Node preNode = get(index - 1);
    ! g0 B# Z6 T6 L# r* z. x0 Y  _            removeNode = preNode.next;
    ; M* u' c* m& Z' \9 n+ Z            preNode.next = null;
    0 F. q, }5 ]+ o; B( M8 ]  V            last = preNode;
    9 o, h' r7 k- [& g* H        } else {! J1 h4 N6 t5 p+ r; Z% l
                //删除中间节点
    + I  P6 h% p" y' K# L4 C4 l4 |            Node prevNode = get(index - 1);8 \& r8 Y: K" {- l+ D6 \
                removeNode = prevNode.next;
    2 p: C* {! G. r9 ~            prevNode.next = prevNode.next.next;" o/ A7 H/ |. \( K, ?$ F( v
            }
    4 ^  C4 P% b8 v+ s3 h; Y        size--;1 \1 [$ y7 I, u) M
            return removeNode;: y, Y2 }! l1 [2 z$ h/ B
        }
    . d* E! H" w) U5 {2 d  @, BJava实现链表的完整代码package chapter2.part2;
    1 c) o$ z, ]) Q# F1 Q. I! P+ J% B) T! j
    /**6 _) P* J- g2 ?1 X7 ~: f/ }
    * Created by IntelliJ IDEA.
    ! [" ]. F' ^) _9 h *
    ' y- O; x+ |# I! L5 T# P * @Author: 张志浩  Zhang Zhihao$ K& p5 e0 J; s; V7 a" Q
    * @Email: 3382885270@qq.com" w' a4 E% T( w* _
    * @Date: 2020/5/3+ C; a# g" H$ @7 R
    * @Time: 13:39
    ! E3 d3 j: J+ L * @Version: 1.0
    6 N. f6 n0 O( D, }7 A */
      Z% A1 f) k. J+ H% Kpublic class MyLinkedList2 {. B$ l6 W/ ~' F( Q
        private Node head; //头节点9 ?# H$ ^0 a/ P0 r9 c7 R
        private Node last; //尾节点
    1 p; b2 F% {1 T  b& R/ O    private int size; //链表实际长度
    - i  @0 C' Y* i: w6 s7 [; D: ~! Y7 ]+ X" ]1 M
        public static void main(String[] args) {1 ^. Y" Y+ G/ X% y; }3 V7 w: c
            MyLinkedList2 myLinkedList = new MyLinkedList2();
    $ m  F* z( w1 R! Y' z" Z//        myLinkedList.remove(0); // java.lang.NullPointerException: 当前链表为空,不可以进行删除操作3 Z3 i8 F0 w- w, \/ G
    //        myLinkedList.remove(3); // java.lang.IndexOutOfBoundsException: 超出链表节点范围
    ) p$ F) t  b* V( L- t5 o, X* Z, j7 q        myLinkedList.insert(0, 3);3 `8 p* h& z1 C* y" H
            myLinkedList.insert(1, 7);5 @4 |+ }% d1 J7 t  V
            myLinkedList.insert(2, 9);
    - i3 j, s/ Z) A1 ^8 ]% j- [        myLinkedList.insert(3, 5);
    6 x2 s: `! ?5 \        myLinkedList.insert(1, 6);) }( u1 {2 }# s0 B; L8 R
            myLinkedList.remove(0);7 n/ _  O: g0 T; o
            myLinkedList.set(0, 23);
    0 B* P9 r* F* A3 {        myLinkedList.output();" d2 @" v9 m, O4 H9 T! Y" T. V3 a# O
        }$ I$ P/ L+ I8 j. [' E

    / X) E* X4 [/ r9 R1 o" P8 G/ S    /**+ ^$ w' @' Z/ u0 {
         * 链表插入元素% U: B& _  e( d! v8 O% G- Z8 }  W3 c
         *
    ; D; J8 l6 @, c: E6 [4 p5 t: J     * @param index 插入位置
    7 j7 c  X3 `5 g  E8 o     * @param data  插入元素 被插入的链表节点的数据( B1 R8 q- M# Q4 g4 l( X4 w
         */+ E7 X; v) w% e/ k
        public void insert(int index, int data) {4 C3 c! `' K3 I0 m) X9 k% [; Y
            if (index < 0 || index > size) {
    ) y. i( `2 X+ ?, g            throw new IndexOutOfBoundsException("超出链表节点范围!");
    ; `, Q( N- s( |3 @% I% z        }
    ( Q8 ^7 N, L7 E8 h% D9 c        Node insertedNode = new Node(data);! ~" F0 ^" ]* u
            if (size == 0) {& T+ L: F2 h2 S+ }% l: U
                //空链表3 p- A9 j( J1 j* |8 }$ B% M6 ]
                head = insertedNode;
    2 e! @  u! s3 \5 ]+ W            last = insertedNode;
    * @9 G" ^! L! P3 j        } else if (index == 0) {
    / _. c" p3 n* w: t$ a) c            //插入头部
    2 x" |: K* D' @  \            insertedNode.next = head;# M& E( ^4 W- [
                head = insertedNode;
    ) r. }; S# k# l! W; F$ \0 l7 j- P: J        } else if (size == index) {* D- K: a% M/ X" x
                //插入尾部+ A( z7 Y  M3 m$ _4 ^
                last.next = insertedNode;8 p( S+ C! r. o( U( H) Q
                last = insertedNode;  i. u& d9 z1 ~5 j+ c
            } else {* N' K4 E* N* ~# {+ p  A& b& T
                //插入中间- D) ], ^" N8 G3 X  V4 R/ A
                Node prvNode = get(index - 1);
    5 r4 X$ T( d  X9 `            insertedNode.next = prvNode.next;
    4 Y5 S! \/ G. G6 O& n            prvNode.next = insertedNode;3 E: {& P0 H9 |
            }
    3 A# p+ G% v! M+ a1 C2 i4 I2 f        size++;
    ' w, V/ A" p. s( K  n2 h  A& P2 ?    }
    " F1 ^9 _0 n/ y6 R7 y# Y5 x( ^4 E6 u+ d: z* E8 c
        /**$ j1 |$ L0 o. T0 t1 M/ q$ V
         * 链表删除元素
    0 T% s) t3 i: e# A- b     *5 z5 r9 Z: Y& S7 E2 g: ?
         * @param index 删除的位置6 ?' x" I# g' s$ @( Q" I  |% q
         * @return 被删除的节点( l" P. F4 P' L; S; s
         */
    . P( p! V5 J5 J' e    public Node remove(int index) {
    % h- t3 O9 D3 t8 u- p; [        if (index < 0 || index > size) {. S0 {. |: h) {) ^
                throw new IndexOutOfBoundsException("超出链表节点范围");
    2 u( B9 Z0 J* e8 V        }
    3 z1 S9 ?3 k0 j# N$ n1 S& H        Node removeNode;* A( M7 m: O9 C
            if (index == 0) {3 `, g, R1 m% Y, _2 b7 d0 t
                if (size == 0) {7 N5 \8 V& i2 [4 @' b3 v% ^7 P7 N
                    throw new NullPointerException("当前链表为空,不可以进行删除操作");
    + |; i- E$ e) u# x            }
    ' q9 l$ e1 X" c' Y5 ~; c            //删除头节点# D% \; ]4 m8 z. y" ]
                removeNode = head;! Z4 D4 _6 @  d' p. _
                head = head.next;
    2 r: ~8 q3 p. V        } else if (index == size - 1) {
    3 y( m! s% {( {            //删除尾节点' _6 G, x+ W; y. t. ~. n1 i
                Node preNode = get(index - 1);
    : }8 t  @5 |; ~7 J            removeNode = preNode.next;5 C1 j3 c. J9 p) O$ m
                preNode.next = null;
    ' g; [+ P; O: k" Z3 r" P            last = preNode;  x! ^+ e1 m. C. R' V9 }6 e1 c
            } else {1 u% u9 j. p: ^4 d+ @$ r# Q
                //删除中间节点0 w7 U. `7 J- V; _2 j8 a! Z& l
                Node prevNode = get(index - 1);+ M3 [: Y; M0 q9 n8 x4 U+ }
                removeNode = prevNode.next;
    & o4 {" Z3 A. |            prevNode.next = prevNode.next.next;
    . o; S; C; q- Q( ~4 G: z0 \4 E        }! x. |4 z2 F7 U& f0 X
            size--;
    7 J+ v5 @/ }. |, ?        return removeNode;& M5 R/ O0 ~: h% j# L
        }
    6 h- u+ y* R$ }2 v  T0 ~8 I
    2 v8 p3 }8 D9 Z8 V3 L3 r    /**
    7 Y+ `) _1 A) d4 ]1 i% {! p     * 更新节点 将列表中指定位置的节点的data替换为指定的data。
    9 y$ P2 V5 h$ i# ~$ v) d+ @# E/ ]     *
    : d' I) R) z" m8 j3 l* d     * @param index 需要更新的节点的位置1 s) v; k+ I8 v* C
         * @param data  新data
    * i; W9 o0 s& i     * @return 旧data! z$ J7 L% p( i$ O( z- s
         */, h; {( ^5 q. w6 h0 a2 v* G
        public int set(int index, int data) {) L. g6 B0 W$ @* O
            Node x = get(index);. P( r+ N7 ?/ q& n7 `; Z
            int oldVal = x.data;9 D1 ~1 S( g' u
            x.data = data;
    % @0 m2 d* e( z" e        return oldVal;/ y( S- t! u) t3 `+ i
        }
    , O2 f, k9 R, {4 S
    - m. u- X# G" P1 E% x; G5 L, @- ]    /**$ M- p$ q6 l8 ^. E1 z9 R
         * 链表查找元素
    , i, o, x) u( `- J- `& x     *
    , i; s7 T7 o  F" U- h     * @param index 查找的位置, l  a. U/ z; b8 G6 G! [; U+ c
         * @return index位置的Node对象) s6 ?2 K7 i7 B- o5 u/ i8 |" n
         */; f! b  A4 E# [7 d
        public Node get(int index) {
    ; q) H: Q8 y5 d- b$ R5 @        if (index < 0 || index > size) {
    7 S0 I( U8 ]5 @' f" P- B            throw new IndexOutOfBoundsException("超出链表的节点的范围!");6 H! {% }  b  H% \! B) ~/ G
            }
    + j9 F. w, B/ A3 w" v        Node temp = head;
    " ~8 W; n: I" C" F# d        for (int i = 0; i < index; i++) {# Q3 R3 X; L4 A+ }: K
                temp = temp.next;
    8 i! m6 {7 T2 Y' t: h/ |        }
      F9 |# E7 ~# e  R        return temp;
    ( y6 Q( p: {/ n: a% ]    }7 `6 [' a  t1 C- [# H6 W
    * J& ~7 {) V3 l1 N8 c. z
        /**- f( A# m7 @& K6 @4 R( n+ ~2 \" o
         * 输出链表
    ' x8 D. v6 e/ Q: V. y# |9 g* m     */
    , x( {- w0 v; Y, a7 n) d    public void output() {
    / \7 M; K* q' k: J        Node temp = head;) U0 E  c" s: {2 i
            while (temp != null) {
    & `  {* ^. s. e1 B- z1 P( E  |            System.out.print(temp.data + " ");
    5 j" B" |7 p& {  M, |9 v, O3 Z            temp = temp.next;
    ) d; I8 j6 }" Q' w( H: h' ^2 [        }' s$ ^% z$ ^. b# z5 x8 `
        }6 e! Y9 e) J* L2 D2 r
    8 P. p1 l3 r6 L* t
        /**
    4 r+ P0 Z8 V, ~     * 链表节点$ T$ Q0 `* s9 Z: b/ \* t
         */
    # v8 U  C- r6 v% k. Y2 ^; ~    class Node {+ s5 H6 S4 h# i
            int data;
    % m. E$ o8 j& t$ Z9 u* H        Node next;$ C- N5 H- D' `- }6 L4 l
    ' a, I8 N, `7 {
            Node(int data) {
    8 a. j; B8 b8 \            this.data = data;+ y  N  ^, g6 g  r; J! ~
            }
    7 n9 B/ v5 m6 L  s# Z    }/ m1 K5 K) w2 k9 T9 a5 }  ]
    }
      U, ^5 R( e% E  S# N
    7 _: e+ [. E! R0 o. h$ W0 L; v6 l
    二、双向链表 12.png $ u% d5 P( \5 a. d
    双向链表比单向链表稍微复杂一些,它的每一个节点除了拥有data和next指针,还拥有指向前置节点的prev 指针。. Y9 ^* F* ^' y& g- C7 h, S/ H

    " D  i$ h( T2 F" ], v
    1 g  W/ p1 E' [0 K2 }0 Q
    7 Z& i# Y& Z& w) P; g# m" N% k/ y; P! c- O
    ————————————————# g+ u! m) l/ m. P; s
    版权声明:本文为CSDN博主「爱做梦的鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    9 M8 X3 _; D6 t4 O: T5 \: S原文链接:https://blog.csdn.net/weixin_43124279/article/details/1059044688 I8 }& [5 x) c

    5 b" D1 F& c) ]! I$ H
    8 @0 T: c- n8 `5 s- Z5 ^/ R" S

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

    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, 2025-7-13 00:21 , Processed in 0.421503 second(s), 53 queries .

    回顶部