QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5181|回复: 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
    + }" g$ `8 r9 w6 j9 y
    【Java演示】什么是链表?数据结构) k# T& M  D2 R3 y" H
    一、单向链表$ Z& `2 V! T  J/ t. \1 R6 P) Y2 T! U, {

    ( y+ Y6 M- T: H3 T' [3 U$ P% _5 R 1.png
      K1 d* K2 ?6 v! e/ O* w3 u# a链表(linked list)是一种在物理上非连续、非顺序的数据结构,由若干节点(node)所组成。! T! I6 t( E, j/ u- z$ o
    单向 链表的每一个节点又包含两部分,一部分是存放数据的变量data,另一部分是指向下一个节点的指针next。1 T! E/ ^  O8 I2 X7 X
    链表的第1个节点被称为头节点,最后1个节点被称为尾节点,尾节点的next指针指向空。
    * x& v+ y' r: x4 n1 e+ ]: x9 f0 o# Z7 [
    什么叫随机存储呢?
    # h: s- _% o% u& ?4 g# j' i4 w& r& S% U( J
    如果说数组在内存中的存储方式是顺序存储,那么链表在内存中的存储方式则是随机存储 。
    ! N" D' R2 W9 e' N* [) q  v上一节我们讲解了数组的内存分配方式,数组在内存中占用了连续完整的存储空间。而链表则采用了见缝插针的方式,链表的每一个节点分布在内存的不同位置,依靠next指针关联起来。这样可以灵活有效地利用零散的碎片空间。
    3 n& V  G! r% h 3.png
    1 a& T' a$ u% w2 \7 |( G, d8 {$ n; L# N5 o- O1 C5 c9 ^

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

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

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

    4.png
      t- d7 f, k8 [( d
    1 ^# _; f5 I! Z( z8 O/**9 t) n' n  w$ X, A$ I) |
         * 链表查找元素3 ]  B' g# o, Y6 g- n5 ]2 B
         *" ?1 }- T/ }5 c* X- N
         * @param index 查找的位置* l% K4 F7 ~; I
         * @return index位置的Node对象
    9 q3 P. O6 X! Y" f     */
    ; k) z' v' m+ K; ~3 D    public Node get(int index) {* q- i' A9 @) A; T" o
            if (index < 0 || index > size) {, R) L6 z9 `8 A: P) s! t; F
                throw new IndexOutOfBoundsException("超出链表的节点的范围!");: S2 i  p, D, e# F8 q
            }. M# P/ N3 g' t$ J  H6 ]
            Node temp = head;
    + G/ |6 F$ ?1 k  m$ u        for (int i = 0; i < index; i++) {" }7 d0 H& Y! P6 ^) O/ F
                temp = temp.next;
    4 G& t; w/ U/ s" k5 b7 t. M        }
    % k% c$ s  L# T2 r& A+ s! `& |- ~        return temp;& c. Z" n- U* _4 O  P
        }
    " V9 w. u. T3 v6 ?/ B% `6 H+ z2 @% |: _2 Y$ m

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

    2. 更新节点 5.png
    9 M) q7 X3 H, s: Q
    $ n2 D% z, h- I3 M. U8 X# k& r如果不考虑查找节点的过程,链表的更新过程会像数组那样简单,直接把旧数据替换成新数据即可。' G% G! e- ?! A+ \! Y- D
    如果不考虑查找元素的过程,只考虑纯粹的更新节点操作,时间复杂度是O(1)# }: K1 K! K, Q0 h2 m
    /**
    . A6 f' u0 m9 I. V4 M0 e% r! I     * 更新节点 将列表中指定位置的节点的data替换为指定的data。
    + M( |( a8 F$ p* K5 l     *" a! n) k3 s0 t# E1 s: _2 w
         * @param index 需要更新的节点的位置' u, y3 i- o0 j' G( R9 J* T9 U
         * @param data  新data
    + \6 F/ e+ P$ \/ s     * @return 旧data. J4 r7 ^0 c6 N3 ~, Z8 f
         */
    ( S+ ~  Q& ^/ J% F7 {* Q; p    public int set(int index, int data) {
    ' X8 b( X$ V: Q, X        Node x = get(index);7 N2 t. I7 S6 T( S0 `
            int oldVal = x.data;% C) R" D' b9 g+ ^
            x.data = data;
    0 M% ^" Q, ~/ y, d: U        return oldVal;
      I2 o, v7 ^! ^9 [3 _0 v* W    }
    7 x3 Q* ^) N& ?) t( p+ @
    9 C% i8 b& L; v! l3. 插入节点

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

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

    • 尾部插入
    • 头部插入
    • 中间插入) n% e0 d1 a  q8 \
    3.1. 尾部插入

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


    . x' F; M+ N' K, j! x 6.png
    $ Z# }  G; e" u- k' s0 @! q) y3.2. 头部插入

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

    • 第1步,把新节点的next指针指向原先的头节点。
    • 第2步,把新节点变为链表的头节点。1 m# ~& o* A2 Y
    7.png # Q" P1 P1 `) u' ?) y
    3 |* |8 F; A% v- j& e$ b# s; O
    3.3. 中间插入

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

    • 第1步,新节点的next指针,指向插入位置的节点。
    • 第2步,插入位置前置节点的next指针,指向新节点。* {7 g$ a9 M+ N0 `
    8.png
    ( x3 H, j+ ?3 N: i" R
    ; b) C: h, H5 u0 L- ^三钟情况的代码合到一起" g; M: p' o! Q

    : n& Z% d8 B2 ]4 b: b' G  B/**
    . x- _) Q; a* b! ~) T2 B! {  Y     * 链表插入元素
    ) f1 O2 c: r' e0 }     *& s+ T1 }% r6 d8 t4 L/ f( K
         * @param index 插入位置
    - |1 F: Y  }; ?! u- }+ G4 |     * @param data  插入元素 被插入的链表节点的数据3 K- |$ a8 y9 _' b2 l6 y! c
         */& @, @6 n4 h* |+ v8 e
        public void insert(int index, int data) {
      ~+ |8 P: A9 [9 ?3 }        if (index < 0 || index > size) {
    ; l$ @; ?3 N2 T+ `& w            throw new IndexOutOfBoundsException("超出链表节点范围!");
    & P1 M' e$ A  R$ I3 v4 n        }; _! a! d1 [! S7 ?- Q9 r/ p8 L
            Node insertedNode = new Node(data);5 h4 R* l2 T& y  p7 `
            if (size == 0) {
    - \1 h1 l7 o) I$ y* t& X            //空链表
    , r- Z! c* T# j9 }9 `9 O' U$ [            head = insertedNode;) {3 u! d# S7 }9 k0 q- W
                last = insertedNode;
    ' c$ R! F! ^5 p4 }- h+ t( H/ R8 V        } else if (index == 0) {4 ^3 z$ U& w' ?5 K
                //插入头部3 |$ k( Y* L; ~& U
                insertedNode.next = head;# W6 p9 l5 u1 k( G: k1 t& ]
                head = insertedNode;4 R) j7 w( l# w2 y* s  E& g
            } else if (size == index) {8 U& A; r; q  ]" X5 N
                //插入尾部+ `( B5 Q5 n  ]$ \6 X! H
                last.next = insertedNode;" ?4 `3 o6 b2 M; E. I
                last = insertedNode;2 I* m! b# a, B+ J3 U
            } else {
    6 D% H' c% g3 R: D            //插入中间5 n8 d/ x$ O2 Z9 {7 @
                Node prvNode = get(index - 1);4 [& n* V0 }& w- ]7 A
                insertedNode.next = prvNode.next;4 E# ]' I0 D# c6 {
                prvNode.next = insertedNode;$ m# q) L" L7 ~
            }9 E8 D7 l/ H9 j2 j: ]
            size++;7 X" S5 ]( g  L: {  T! d/ k$ z+ }
        }$ p% u* p2 j3 G0 A/ W; |

    3 a! b" C4 u$ M  y' p% D/ g4 z/**/ z. S8 N3 W8 l' f* h8 z
         * 链表插入元素8 }( t0 J! c6 J/ r4 G: a  p
         *) U" f9 c$ a6 `1 Y7 u- ]
         * @param index 插入位置
    ' g& E5 C: ^" a: v5 h     * @param data  插入元素 被插入的链表节点的数据4 g1 m  p. w9 r8 K9 B$ U& _5 F
         */0 b2 x, ]2 g( \* v
        public void insert(int index, int data) {
    4 @* S, z6 u5 v) g7 A        if (index < 0 || index > size) {/ I. `) d1 {( |8 k) G& \; _
                throw new IndexOutOfBoundsException("超出链表节点范围!");
    / {) r( b! {6 R+ |; h        }
    + }3 v4 v' n" Q: G! c& E0 D) I        Node insertedNode = new Node(data);2 W" R# {1 w* S" e7 c& W, B( f
            if (size == 0) {
    # l1 R! W0 _1 m" t, r            //空链表4 b8 H2 {  M0 a, j& d
                head = insertedNode;
    4 V/ m! m+ r+ o& Q            last = insertedNode;
    4 I6 v& N; u6 B2 v        } else if (index == 0) {- u2 w# i) p, K0 `/ _
                //插入头部+ p2 f  d  V" W; G
                insertedNode.next = head;8 M5 X1 j& @5 ^0 }% P% n6 v) r
                head = insertedNode;4 }5 W- u+ m$ q6 l6 [! L7 t
            } else if (size == index) {
    : ~/ Z* ~, q* W            //插入尾部9 F- n/ Q8 G" w9 o# ?  m
                last.next = insertedNode;
    * f8 j: ]: d& h            last = insertedNode;
    6 ~  T8 T# p' n! b! n        } else {
    2 E, H  h, r# ^. B0 m9 j( S) j! E            //插入中间
    1 o" u) J# ?, w/ S            Node prvNode = get(index - 1);
    - l. I' N. ]: q6 V$ U! U            insertedNode.next = prvNode.next;
    # O. y( k: e- c" D% `( Y: x1 w* r            prvNode.next = insertedNode;
    3 z3 Y4 Z, l. |& V        }
    4 f: r8 ~  A/ ^1 p        size++;( D! T  H9 G1 b0 e
        }3 Z8 C( w/ Q$ y5 D; _- n" z
    4. 删除元素

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

    • 尾部删除
    • 头部删除
    • 中间删除
      9 M" C  ]# R7 d! ^$ D9 |
    4.1. 尾部删除

    尾部删除,是最简单的情况,把倒数第2个节点的next指针指向空即
    $ V& K/ B. A+ X- O4 c& O4 E. O可。

    9.png
    " f) D8 c: l7 W1 m6 W) S5 x. v6 p6 H) G  B8 L
    4.1. 头部删除

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

    10.png
    : L1 Y4 R% S. J: Z9 H' S# l0 C8 f1 f2 u5 A6 U6 w# T( A
    4.1. 中间删除

    中间删除,同样很简单,把要删除节点的前置节点的next指针,指向要; w% |; Z9 l; ]7 X% T  \* O: s
    删除元素的下一个节点即可。

    11.png
    # K- v4 O1 [, t0 G; A! d. D
    & b/ n+ }4 P$ Y5 `* d9 ^; Q
    6 v  s2 Y' ]( i( O- W$ [. i9 V0 a这里需要注意的是,许多高级语言,如Java,拥有自动化的垃圾回收机制,所以我们不用刻意去释放被删除的节点,只要没有外部引用指向它们,被删除的节点会被自动回收。
    . A1 N9 _- `# C# R. W如果不考虑插入、删除操作之前查找元素的过程,只考虑纯粹的插入和删除操作,时间复杂度都是O(1)
    # \& V, w' M1 W; R2 ~% A" p/**
    ( I5 K, \0 Y% {* z     * 链表删除元素! t$ V: P+ V- x1 g1 J# ?! j
         *& h, G$ i& v( x1 C
         * @param index 删除的位置! z  f5 |3 L$ E9 r9 n  D
         * @return 被删除的节点& Y2 O( q( q( W& `; I; U
         */1 h. T6 J4 E; e  k; M7 M4 x
        public Node remove(int index) {
    . u- p3 ?3 Z  h* G( S        if (index < 0 || index > size) {
    ) {8 m; E; P& `+ Q0 C' s            throw new IndexOutOfBoundsException("超出链表节点范围");. Q# |. \1 G% c' O0 i' F
            }! B$ [# Z) x5 {& A- t
            Node removeNode;
    0 R$ {* r) c# e$ z6 k6 B% k2 R        if (index == 0) {4 |" i! o9 [# r0 K- ?" A9 }
                if (size == 0) {
    3 _  W. S: q9 _; E1 ~7 y                throw new NullPointerException("当前链表为空,不可以进行删除操作");
    - k$ F- N& p* G" A            }1 Q8 g' `/ l; @0 e
                //删除头节点
    2 W, y$ o/ p  h- _            removeNode = head;& T$ z( ~3 N( ]+ k
                head = head.next;1 \$ ?, K; y( P* D" c
            } else if (index == size - 1) {. B+ `+ d0 I* J( J8 Y" v; I
                //删除尾节点- J( M) O* e2 g) H- w. _" D" s
                Node preNode = get(index - 1);
    : a6 K( F/ p2 h+ s, H! G            removeNode = preNode.next;; H5 |. Y& C3 O1 t, W) ~( g" A
                preNode.next = null;
    # n+ R, G' q' r7 y) J3 r5 K9 d            last = preNode;) m4 {! n. J# g( A2 w
            } else {' `4 \) E' ?6 {
                //删除中间节点
    4 X+ u# A4 [5 [# z2 w9 ~            Node prevNode = get(index - 1);
    $ }9 y6 F) W# M, q/ q            removeNode = prevNode.next;( z& S( U2 x  }( y: {' \/ r# h0 v9 w
                prevNode.next = prevNode.next.next;
    % w! B7 D* x6 ]% T, ^        }0 d7 G: u. l1 A8 a0 i* |$ W( Q
            size--;
    0 q! H1 N# ~2 C( R% g1 ~        return removeNode;& x" Z1 Y, S2 g4 R" o
        }
    0 L; F, @! S+ C2 H. ZJava实现链表的完整代码package chapter2.part2;# p7 s3 j& {( g" [& n( B
    9 V4 l! d6 U! c! h  @
    /**/ V/ }! v8 f: p, P" E% k
    * Created by IntelliJ IDEA.1 m8 A) ^  K1 d8 J  W* P
    *
    " r& v7 t: m  i0 v7 c * @Author: 张志浩  Zhang Zhihao: S, u% U0 D$ s" @- k, i8 s
    * @Email: 3382885270@qq.com
    ! b4 v  f6 d% k- O * @Date: 2020/5/3: i; H) n& ?6 o8 Z
    * @Time: 13:39$ {$ Q5 R( {/ b3 G$ }5 @0 O; O/ U
    * @Version: 1.00 E3 V0 E8 M. z! i' F6 @
    */6 R. T7 _0 q  S+ |4 y! p
    public class MyLinkedList2 {3 k5 }1 L  W( p8 j5 C& Q( t
        private Node head; //头节点
    4 n8 I. M% ]% E" E% e    private Node last; //尾节点  |! V0 x% d: S0 p1 N) o
        private int size; //链表实际长度
    ( _; v5 c; v7 B! @& R" z! Y" {5 u9 V
    3 E; Y4 \" r" s* Y1 P    public static void main(String[] args) {3 v. A1 U6 s* R( z8 }) B
            MyLinkedList2 myLinkedList = new MyLinkedList2();
    2 ~' R% b/ A  U5 a! g; y6 P) M//        myLinkedList.remove(0); // java.lang.NullPointerException: 当前链表为空,不可以进行删除操作
    ' s. m  s. e. r8 E//        myLinkedList.remove(3); // java.lang.IndexOutOfBoundsException: 超出链表节点范围6 ], B5 m/ A( F% N$ Q
            myLinkedList.insert(0, 3);$ R. L' ?0 [' v1 {( Z  v5 m
            myLinkedList.insert(1, 7);
    * b& q# P7 C4 P, v0 q+ ^        myLinkedList.insert(2, 9);
    * _: f2 A. u) `0 Y        myLinkedList.insert(3, 5);1 B/ w$ f6 a: L
            myLinkedList.insert(1, 6);
    . H1 M/ v3 o  \: C6 l6 X' S        myLinkedList.remove(0);
    / B, K3 t% A5 ^        myLinkedList.set(0, 23);- ]4 V4 Y. p$ p- }, U
            myLinkedList.output();, ~5 ^8 x. Y6 O( m& N9 q
        }
    + ~0 R& Y( x& W' v* x7 Z& }2 ]8 b7 R; ]7 `0 v
        /**% e0 ]1 T1 l* \% C0 @) x' H
         * 链表插入元素5 F( I: l3 q) D6 g" {, L
         *1 c5 ?$ l; {; H
         * @param index 插入位置2 W4 a/ C* j) T4 h$ g( N
         * @param data  插入元素 被插入的链表节点的数据
    " Z% u3 Y  a) h4 L  r! c; g     */
    ; a0 u% r8 P# `! @6 H: `. p& J" `    public void insert(int index, int data) {! E) d6 i3 O- S0 i! q( W
            if (index < 0 || index > size) {% t. s. O6 ~; N: M! f
                throw new IndexOutOfBoundsException("超出链表节点范围!");# }3 t2 l9 U& e( |: I" E7 p
            }* G$ q7 `6 L0 Z# K; V
            Node insertedNode = new Node(data);
    & |) I& X' j5 @9 k/ L        if (size == 0) {+ {" P4 G5 M- [' d, U7 D. Y: p# |
                //空链表4 R2 c& D7 A, q2 [/ T) H! E
                head = insertedNode;
    . s( h. j% Z/ E% w- F" ?0 `            last = insertedNode;2 ^  n# q/ D. d$ k& [( q  Z) B% M
            } else if (index == 0) {
    9 y* K' Q# U8 F5 q            //插入头部' F/ V+ A" b, g: l$ P9 g
                insertedNode.next = head;$ Q, N- y3 i9 b5 W- U" p# e
                head = insertedNode;
    ' Z1 b8 c. Q, ?. |% Q- p8 Z        } else if (size == index) {
    ) X& j/ ^$ ?( h. d; r0 I) |% J3 L            //插入尾部/ f5 t4 Q: _3 k$ ~- u& q, Z2 Q8 b% m
                last.next = insertedNode;
    & Z$ m' e/ C. p5 T# ^  |            last = insertedNode;
    9 D) @8 s0 n" O3 I        } else {
    - i; S% H6 X8 p( {            //插入中间0 C& j! _. ~# U" o
                Node prvNode = get(index - 1);
    0 s" g9 o9 v7 p            insertedNode.next = prvNode.next;
    * t; m7 r! z, B1 L6 [            prvNode.next = insertedNode;7 U1 I/ C$ ^) W8 s" X
            }
    8 B4 {& R9 N1 O/ H        size++;9 u7 k4 o$ R9 V
        }
    - M& T6 M  d( N9 |' Z: z
    ' i$ ?' o* I: }0 ?" \    /**
    2 z( z! l( S+ D2 R6 H3 D7 r' i     * 链表删除元素
    $ }4 a, R2 X$ ~$ v9 g     *
    ; [; A) ^/ E) D     * @param index 删除的位置
    : G. J" B0 ]% ^# g# j& O     * @return 被删除的节点
    - ~1 ^. Y/ s/ ^& x, G- M* D     */- ~$ }4 ?- t0 x; d
        public Node remove(int index) {5 y# R/ [  k- t% G
            if (index < 0 || index > size) {" ^( h3 B8 m9 |" @4 y) m
                throw new IndexOutOfBoundsException("超出链表节点范围");/ z8 |$ ]: L6 x! I- y
            }4 |5 Q7 d2 i; s6 i. ~  h
            Node removeNode;) x9 I* J* M. G! `* L
            if (index == 0) {
    . p) X; N7 u- i/ F            if (size == 0) {% }; C9 N8 y& F7 v- r# i# H: C
                    throw new NullPointerException("当前链表为空,不可以进行删除操作");$ l- r, k$ @% C, U/ o5 Y
                }! X" j' f3 q9 C. E# a: P0 M
                //删除头节点
    / T" }* ~6 L5 Y            removeNode = head;
    ' t; A; N8 ~# [! C7 }            head = head.next;+ P& X  \) ]1 D% I& e9 h( V
            } else if (index == size - 1) {2 g/ ^/ f& j, F& ~( D  g4 u+ _3 i4 f
                //删除尾节点
    ; Z' F- Z* G6 E$ c2 j            Node preNode = get(index - 1);9 N( w! k7 G0 Q2 v8 ^
                removeNode = preNode.next;/ X. ^% p; a: D
                preNode.next = null;; i1 J1 C  W: W1 }4 [% [. Y! I& o. o
                last = preNode;
    8 }  b" x" C8 `; K1 F; x9 p* _# `9 s- N        } else {
    6 H4 ]+ E. j7 W) Y            //删除中间节点, T+ q0 z8 M$ |% h5 V  g+ e, L0 I* }
                Node prevNode = get(index - 1);
    & K" B+ a* G# w0 z& t% }4 F% u8 T- `            removeNode = prevNode.next;+ B6 m& s0 x! o/ a9 I/ V! V! B
                prevNode.next = prevNode.next.next;
    & `0 M5 k# j3 c        }- Q- }" L9 @6 S8 M* N
            size--;
    % _; c5 b* ^9 J9 l        return removeNode;
    . \1 Y- _) D# F9 F; J    }
    - B$ p! |% x: P' W& r8 D* Y- {9 J1 J. D8 n
        /**2 s& W2 B7 W' ~2 q: l# G* a
         * 更新节点 将列表中指定位置的节点的data替换为指定的data。$ B0 q) D! G: K+ F! X3 y
         *( [! ^: r+ h7 ^4 `" G: ?$ {
         * @param index 需要更新的节点的位置9 b' d% n5 s* o' ~
         * @param data  新data
    ' Q9 \4 A7 \9 Y; p+ k     * @return 旧data
    7 S. J0 t% h" G0 g. T  s     */
    1 R/ _9 u6 S0 G    public int set(int index, int data) {
    # f8 J  y! r0 O* d# ]/ s        Node x = get(index);% F- @) ~0 A$ [2 |, z3 Z
            int oldVal = x.data;
    3 W8 w: y8 N' Q& d% I. D9 ~- I        x.data = data;
    $ _/ _& W2 x7 W) _        return oldVal;7 O' h& ]. j& [4 G4 B5 S4 M
        }
    ! c$ s$ L/ N' u7 V  I& k6 Z" l5 U7 }, Y/ v  ?" _
        /**. x6 d% e  P# H" \
         * 链表查找元素
    1 S8 G. y$ K! }0 a$ K     *2 D9 F1 x- I3 J# r$ q; [
         * @param index 查找的位置
    , d7 H0 f: r9 [8 Q% \* J" N6 x* w     * @return index位置的Node对象
    - \0 y, ^" K! n% W" g5 |) w     */
    ; s% W& K" x3 d1 G4 ?    public Node get(int index) {
    ! h' J6 w* v5 F% U  C        if (index < 0 || index > size) {$ R+ f' M) c, T" Q
                throw new IndexOutOfBoundsException("超出链表的节点的范围!");
    - [: z- l7 F" \, W5 Q+ b* \9 R0 O/ I6 }- V        }
    8 K2 A+ P$ b7 n% Q7 ]6 ?" W        Node temp = head;/ F1 }/ Z4 D3 T4 g  J- ]3 f( j
            for (int i = 0; i < index; i++) {7 I  f% {7 l( H& I  J; {
                temp = temp.next;$ [7 F2 p/ X! _/ c! h: H8 T* S
            }
    3 A# A1 i4 B  T& O' q( t8 Z        return temp;2 \2 s' x# [. n- G* _
        }
    6 v9 t4 E1 [" G
    6 y9 H# h: w  u' H    /**6 ]8 \% \) ~& R2 ?% u0 u
         * 输出链表
    ( C9 h8 S  |3 p3 }9 o  _2 _% e/ W     */2 g, N/ |9 y- f* F, i
        public void output() {' c- ^* @9 G; J) D% @0 O
            Node temp = head;( w/ ]$ X8 `, @8 H
            while (temp != null) {
    " _9 x9 L& j& n" |            System.out.print(temp.data + " ");/ w+ J, Y- Q/ I& f
                temp = temp.next;7 b5 Q8 R6 I, U  B, J" b  A
            }# z6 H0 M% y9 c* A9 J( t# A
        }
    + I, [+ H% U$ D" u; E! s3 V$ J& t" j- f
        /**; e4 F, _! J% B$ A" ?6 B
         * 链表节点
    : b; |" \7 K: f7 M8 k( n: g# V; t     */9 k( w5 F; q1 A
        class Node {0 K2 w8 t$ W9 t) {# e
            int data;
    . d/ \1 l. `: X* r7 k- N$ G        Node next;3 H1 s3 g; V: X) ?

    & _' I* P! }0 S, G  z0 q* U, w        Node(int data) {
    + b; B% _7 n( M( F$ `0 O            this.data = data;3 x4 ?' _- v0 r+ S3 o: s3 N
            }3 a8 t1 L0 Z1 B4 U$ k( \
        }
    ) W: o2 W  V5 Y}
    5 H+ s# d, m0 s( \" u; O$ L5 g& [% w, N1 P3 z( ~
    9 T/ T4 @. N5 G/ c! r+ D
    二、双向链表 12.png
    6 v- f1 r; Z* {* v2 ]$ K双向链表比单向链表稍微复杂一些,它的每一个节点除了拥有data和next指针,还拥有指向前置节点的prev 指针。/ s. V& e- R0 K1 n/ h+ }

    8 _# Z0 ?# c& }9 [  S" N* H7 ]' T: y. i) V. w! q

    1 ^6 M' o9 W0 j8 r
    3 [+ k  A. Q* b2 G" D* N: q————————————————
      j7 _5 }( K2 M  Q! `  B9 X" o版权声明:本文为CSDN博主「爱做梦的鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    1 M4 V' s; i, M原文链接:https://blog.csdn.net/weixin_43124279/article/details/105904468
    1 C* ?" D/ Y6 J6 x, F
    / E1 q6 c$ w5 k" T) p  |6 @+ S/ Y. O, [1 l' r' b7 k, g* B# R% H" G

    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-10 18:25 , Processed in 0.619934 second(s), 53 queries .

    回顶部