QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5138|回复: 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
    3 x4 Q$ D9 q5 i6 G4 o, J+ z
    【Java演示】什么是链表?数据结构5 ~' h7 a7 `* g& D% N8 u
    一、单向链表) X1 m6 n/ {) A) l

    5 v2 i/ H2 z; P2 d 1.png & L8 u* D3 E8 c: k! O  g# O
    链表(linked list)是一种在物理上非连续、非顺序的数据结构,由若干节点(node)所组成。
    9 Z6 b$ D; V. T$ h单向 链表的每一个节点又包含两部分,一部分是存放数据的变量data,另一部分是指向下一个节点的指针next。# U: G" f, X. v: p. l( Y5 g
    链表的第1个节点被称为头节点,最后1个节点被称为尾节点,尾节点的next指针指向空。4 Q/ |  C. h, _: M, X& v9 m
    " b  D; t' I1 H
    什么叫随机存储呢?  J0 a+ x* P* t: i. f+ k5 u% P) V

      Q8 A, ]4 d  H# Y+ H8 n7 X如果说数组在内存中的存储方式是顺序存储,那么链表在内存中的存储方式则是随机存储 。
    ! p5 ~$ R" p( r& B6 `上一节我们讲解了数组的内存分配方式,数组在内存中占用了连续完整的存储空间。而链表则采用了见缝插针的方式,链表的每一个节点分布在内存的不同位置,依靠next指针关联起来。这样可以灵活有效地利用零散的碎片空间。
    5 P3 ~5 q; v) R) j2 O 3.png " c6 a6 P) e; A5 Z- I* w
    * \7 F# C* \) Y1 w

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

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

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

    4.png
    . ?7 R5 S* I$ b0 h6 ?1 A7 A) F; s( W8 j/ s3 B+ A2 H
    /**/ y9 u4 ~4 d/ ?0 c
         * 链表查找元素
    5 `1 _6 f- d" o; p1 n  K( X2 G     *1 @  Z, i- @/ w- D, p
         * @param index 查找的位置- y# R" I, m8 H% _+ q' k( l* e
         * @return index位置的Node对象. O6 W% n/ x8 X2 t4 v% c) {$ }
         */$ a% }5 T' b6 x& B8 h
        public Node get(int index) {
    1 H& B/ c% M" f  b; M/ Q. U        if (index < 0 || index > size) {: z+ U5 h* a  d
                throw new IndexOutOfBoundsException("超出链表的节点的范围!");  t9 M) P; o2 e0 F
            }7 u% U3 |4 O) K9 X2 \0 _) ]# w
            Node temp = head;* [4 C/ l* m: `6 }1 C+ l& \" Z& }
            for (int i = 0; i < index; i++) {
    ! N" H) u# g0 e% L            temp = temp.next;, r5 b. ?% _: F' @: U
            }  {& Z3 w4 `1 A' }3 y+ @: R
            return temp;
    3 V7 f4 r: P% ]9 e4 n% O    }
    ' V3 `1 c2 Z' x# {
    % m, X9 s/ g9 @( U) o3 D

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

    2. 更新节点 5.png . n# t8 ?: d3 d8 G6 Q9 u0 ]
    * X0 T- R. M# ?) O, X0 y! C
    如果不考虑查找节点的过程,链表的更新过程会像数组那样简单,直接把旧数据替换成新数据即可。2 P" y  K3 O; l: r! i- a+ z
    如果不考虑查找元素的过程,只考虑纯粹的更新节点操作,时间复杂度是O(1)
    # `1 [. @2 m* \2 _* A) }$ B# P/**  V$ J5 P5 D  b8 K
         * 更新节点 将列表中指定位置的节点的data替换为指定的data。' U, y, d- q* N* L
         *- y5 p5 o4 A  h4 P1 F/ e
         * @param index 需要更新的节点的位置  S8 l( l+ b, w
         * @param data  新data
    0 S) Y4 ]3 z) `! B# H1 S! u     * @return 旧data
    ; I) f* S0 N, U( ]     */, L0 ~6 A; }/ j' u& C! q
        public int set(int index, int data) {
    $ K: Y7 @  S8 a9 Y& z! n1 G! p        Node x = get(index);' p5 N  P; l- S( S# z
            int oldVal = x.data;
    - w& d, h6 k0 B3 @        x.data = data;
    ( D# c- q) G$ I        return oldVal;
    * r8 x3 C% D4 [) {) U) _+ K    }
    . J# O. D! K% R: U6 j
    # z! @6 P5 a# B3 o3. 插入节点

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

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

    • 尾部插入
    • 头部插入
    • 中间插入# T3 [; [$ d0 T
    3.1. 尾部插入

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

    3 Z# \, p! P# R
    6.png
    ! @" S, f0 g) t5 |# ]6 m3.2. 头部插入

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

    • 第1步,把新节点的next指针指向原先的头节点。
    • 第2步,把新节点变为链表的头节点。
      % k8 O: |" w1 t: b, U5 q0 q8 r( N
    7.png " F$ Y% F* b0 D6 _8 L9 n/ c5 }

    # ^" s. h; `$ ?& O: z' E! D8 \3.3. 中间插入

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

    • 第1步,新节点的next指针,指向插入位置的节点。
    • 第2步,插入位置前置节点的next指针,指向新节点。. Z! u% _* A1 `2 N3 y" N
    8.png & j2 B" R/ F2 ~
    & c! `3 g" F2 C  V$ e9 z" ^
    三钟情况的代码合到一起
    8 I/ l) o0 s( v+ T+ o% K
    $ u8 W- N. L' [5 S' ^6 S9 x/ u/**
    1 I8 r# F3 K7 X# f8 H3 |' u     * 链表插入元素* n& R6 t" e# m5 v8 D
         *: j$ m4 I* i  J/ u3 X6 A8 @* X
         * @param index 插入位置+ A+ Z( k( q" s0 u% A
         * @param data  插入元素 被插入的链表节点的数据
    7 M3 N  E  H% e% \: F- F     */, K0 f! y3 Z# Z" {
        public void insert(int index, int data) {; T# v2 w$ b9 K8 X* C
            if (index < 0 || index > size) {9 X0 @9 W( K. z, u) N, x0 J' {
                throw new IndexOutOfBoundsException("超出链表节点范围!");
    7 l$ Y( V7 D# |- W( ^        }& c8 l6 M- w1 h& l2 i
            Node insertedNode = new Node(data);) s9 Z5 u- P1 ~1 [! u1 D/ i! l
            if (size == 0) {+ a( @; V& _) ]% K- `$ k- }9 R
                //空链表$ K3 E2 @0 z3 k5 C
                head = insertedNode;
    , i: R+ b, `4 Y4 Y( B            last = insertedNode;
    $ J  j4 T  O1 P. r2 K4 ]1 O- n2 u        } else if (index == 0) {7 a$ N$ U5 i8 p- M& J' c( E+ ~( I
                //插入头部* }* P  M! ?6 S& ^7 J
                insertedNode.next = head;
    $ w- R; s8 U! I7 B# h* x/ z            head = insertedNode;: ?$ m3 k: o; M/ y( s* s7 l
            } else if (size == index) {
    ! o. p& G" D; `- C; D% p* d            //插入尾部: j" r! X$ |9 }2 ~
                last.next = insertedNode;7 D0 c) S6 W/ M" ], X: [
                last = insertedNode;
      K5 w5 {3 A1 |* x1 m) ~        } else {
    : P4 v9 t0 Y/ `* m# u            //插入中间( |) Q% e3 y) _6 n
                Node prvNode = get(index - 1);
    2 T+ Z+ [5 e* w* @: i            insertedNode.next = prvNode.next;
    + C8 z$ U# Q6 u; H            prvNode.next = insertedNode;7 \2 r" W0 f: o7 r  l
            }9 H7 E) E: R$ s/ x6 t5 j/ p
            size++;
    ! P! R3 C- v7 J" H7 X    }
    $ x2 c3 U  U0 Y" w3 {0 F( x, S; g) K+ n$ `5 d
    /**4 {! h; ~, ~% I+ Y0 G/ v4 y8 c
         * 链表插入元素
    2 X, R* e" N/ Q" ?, m" V     *8 H" k5 ?  Y' D# G5 S
         * @param index 插入位置& O7 B6 g. z+ Z! ]
         * @param data  插入元素 被插入的链表节点的数据
    ' q3 Q4 q0 a8 e- ]5 a     */( ?4 A: K5 M" s5 f
        public void insert(int index, int data) {
    # `0 d, m2 X6 U6 Z+ r; F& a9 _        if (index < 0 || index > size) {
    9 @8 s& L% [$ U3 A1 ?: d0 Q            throw new IndexOutOfBoundsException("超出链表节点范围!");/ z! ^# S& c; ^( ]* {. C! `
            }
    ; ~7 m2 J$ d$ o1 `        Node insertedNode = new Node(data);" ?; m( r+ d- S' q+ ?. m: j
            if (size == 0) {4 e! h% ]  G8 R0 v
                //空链表$ n0 T: B5 F2 A; V' A* b$ M% v- T
                head = insertedNode;
    1 Y; `( @1 M6 Z; I            last = insertedNode;0 d7 z* B0 J9 ^1 t" d. S
            } else if (index == 0) {- w" j/ Q6 T( F* K# D6 Z* C6 E
                //插入头部
    2 g4 D0 A: [7 T9 t$ n! W7 Z# Y            insertedNode.next = head;
    0 k+ `) |( E3 h            head = insertedNode;4 x1 J7 M, t$ c
            } else if (size == index) {1 e4 o$ ]' w+ X9 ?4 `
                //插入尾部
    6 |' I9 F- `- ?1 R            last.next = insertedNode;/ |6 O) Y1 Y# D% s9 _. S! N
                last = insertedNode;: i/ W9 q% Z) I: _
            } else {
    . d" t, z/ c& ]( I6 ~: i            //插入中间
    1 e- e. y) Q1 o. r& p            Node prvNode = get(index - 1);
    8 }( X1 b+ Z' ^            insertedNode.next = prvNode.next;
    : G% X$ G, h, ^* [% y            prvNode.next = insertedNode;5 }3 Z5 f1 o) H
            }3 ^- j- q1 l8 A
            size++;. I7 u3 V! C  J1 _, G; R8 J
        }
    7 v2 @( @' t2 R4 o* I7 a7 b4. 删除元素

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

    • 尾部删除
    • 头部删除
    • 中间删除
      " H+ [. X( b6 o* M4 P
    4.1. 尾部删除

    尾部删除,是最简单的情况,把倒数第2个节点的next指针指向空即
    0 J2 {9 H: v" g. `可。

    9.png $ L8 U9 T& w8 W. p3 p' Q8 u2 T
    * C% {! D0 @  O# R' W9 A4 F
    4.1. 头部删除

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

    10.png % ?/ M5 f' z8 k. C! u' ?

    + {8 |0 D5 H) e1 i9 G6 x7 ]  B4.1. 中间删除

    中间删除,同样很简单,把要删除节点的前置节点的next指针,指向要% M& r% c( @, S5 l0 ~
    删除元素的下一个节点即可。

    11.png
    ) c+ f, F  R9 q' @) d8 o/ K6 E
    / _0 t# u0 N! W, c& N* ~
    1 z8 o* F. d. n, n  j这里需要注意的是,许多高级语言,如Java,拥有自动化的垃圾回收机制,所以我们不用刻意去释放被删除的节点,只要没有外部引用指向它们,被删除的节点会被自动回收。, i  x1 F/ K/ v4 w$ `1 y
    如果不考虑插入、删除操作之前查找元素的过程,只考虑纯粹的插入和删除操作,时间复杂度都是O(1)
    ' b& ^$ {1 ~3 y/ h) S- U$ H/**! [: }. k6 T& Q7 v$ E
         * 链表删除元素/ T, }6 F2 H$ x( t2 i
         *
    * V2 z7 |( x" [# E4 G     * @param index 删除的位置
    4 s' i9 b0 \3 `. k/ z+ @0 }) E     * @return 被删除的节点
    - ?7 Y' V  R0 D$ \     */
      M, d* a- N& C" e0 @& m5 f, u, t) t    public Node remove(int index) {; k  P: F8 b! }% M+ L- |) @
            if (index < 0 || index > size) {
    6 B3 M. p1 b9 m* D            throw new IndexOutOfBoundsException("超出链表节点范围");
    . q6 z2 I0 R. |* F. r9 Q( t        }
    5 f1 i# ^3 s/ h9 g) y. j* K! f        Node removeNode;
    ' T4 a/ N5 R- k        if (index == 0) {- T: M7 ?* _( t+ w3 z
                if (size == 0) {
    ) l6 o) H( Y7 k! c                throw new NullPointerException("当前链表为空,不可以进行删除操作");
    1 ^4 Q& [6 k, m3 M! G; J+ h            }
    $ e' h) G9 _1 O- F8 Z. U4 d            //删除头节点  f; u9 D+ E+ a
                removeNode = head;
    9 M6 A' M( `; [' s9 U& {0 B( R            head = head.next;( F8 B0 \3 m* a8 J. z
            } else if (index == size - 1) {
    : z2 J) Z; e  B6 j5 P7 ?: ?$ c            //删除尾节点
    # ^) b! m5 h; A* I% V            Node preNode = get(index - 1);6 c# j( X4 a& X% d% C5 d
                removeNode = preNode.next;
    6 x  U& j( r* |  h( {* `            preNode.next = null;- t8 g$ r# ]2 @7 h, N. i
                last = preNode;% R: ~: Z8 I, g3 U+ v1 w8 U* U
            } else {; O2 K. m) I1 a2 W' w
                //删除中间节点
    , v. v* A! @$ @3 B* X) k            Node prevNode = get(index - 1);2 k6 i$ B0 }/ k2 [
                removeNode = prevNode.next;
    3 q1 S2 y' f8 o4 C: _            prevNode.next = prevNode.next.next;  k6 g" d& s  x2 D# n
            }1 G0 H# `; C' `1 y- ?
            size--;* h8 U+ H  i0 H" b5 W3 G5 t
            return removeNode;
    9 K+ y$ k& I. @& o! V    }
    ( r& `$ k6 x# D5 zJava实现链表的完整代码package chapter2.part2;' T% a! v1 S8 z0 w

    ) W  v1 y3 f5 N  @( N/**
    9 [6 A2 `' N7 F * Created by IntelliJ IDEA.
    - z; X4 {; c8 U; m9 w *
    1 R- j) j4 n/ \+ I7 ?+ R * @Author: 张志浩  Zhang Zhihao: x% ]/ b! z# f! |3 {
    * @Email: 3382885270@qq.com5 \! h. l: |* z, N. u' D2 {
    * @Date: 2020/5/3
    8 e& t  C; G  d * @Time: 13:394 v% {2 J8 v" ~' Q. p# {* j
    * @Version: 1.06 B4 h$ ^; z: w- m
    */3 N6 }3 }8 Y3 w% ~. C( ?
    public class MyLinkedList2 {
    . s' ^/ \! a8 H9 z    private Node head; //头节点* ~  C9 w3 Y2 ~' J
        private Node last; //尾节点
    & o7 G$ `. P# Y4 s2 o" {* x: ]: k/ A/ q    private int size; //链表实际长度2 _4 N  \$ d* s- U) {/ [

    " V+ _7 B* A9 n  n' q) K) P7 Q- w    public static void main(String[] args) {2 H; U, A0 @) T) q, K) D7 e
            MyLinkedList2 myLinkedList = new MyLinkedList2();
    ' J3 h2 i  S2 y, K/ \! F0 g//        myLinkedList.remove(0); // java.lang.NullPointerException: 当前链表为空,不可以进行删除操作
    8 P: ?' P; h1 C8 d0 A: c/ d//        myLinkedList.remove(3); // java.lang.IndexOutOfBoundsException: 超出链表节点范围; t, X7 I2 J+ r3 i
            myLinkedList.insert(0, 3);2 X0 G8 U: z9 ^" {; _. Z) N
            myLinkedList.insert(1, 7);2 }4 `, ~" a5 E+ ]9 ]/ e
            myLinkedList.insert(2, 9);
    - i% ^3 V7 v7 W% k        myLinkedList.insert(3, 5);" p% ?3 {+ E8 a4 W3 F+ Y; V9 S
            myLinkedList.insert(1, 6);
    & A! o- ~8 h: ~. H        myLinkedList.remove(0);
    ) \, h4 ]4 t# Q& R" h- P" F        myLinkedList.set(0, 23);$ w2 X2 u( g8 W6 U: g
            myLinkedList.output();
    ( ?, n3 m) K$ w$ N! d8 I    }
    ' K) v3 N1 x1 ?2 M: j
    2 L: f! w# k5 `& p% ?# q    /**, j3 q% z1 p& z6 W. t% n
         * 链表插入元素3 H: C" e9 g* ]5 v. U
         *+ F+ ~! z7 z- t# c* B% `  h& ~8 \
         * @param index 插入位置
    " G' K8 S+ @6 A3 s5 ^! @     * @param data  插入元素 被插入的链表节点的数据
    & _0 r+ J2 a. A6 T: }. s     */
    ; a% K) x4 E" `" C+ F. W    public void insert(int index, int data) {
      n; \& |* t) y. g- L" f3 _        if (index < 0 || index > size) {: Q/ m. c: e+ V0 Y+ u5 ]! N
                throw new IndexOutOfBoundsException("超出链表节点范围!");: E1 K% n( Q( T% t
            }2 `0 Q+ s+ W5 l; |6 X$ |& S  h
            Node insertedNode = new Node(data);
    ( O& C, \! F! m5 }" {/ S        if (size == 0) {
    ( A/ {1 F/ W% f8 i: J            //空链表
    & }3 _. ]6 k/ a2 R2 r3 S            head = insertedNode;8 f) ?. L6 E2 y/ `2 ]
                last = insertedNode;: v# l% C7 p+ W: Y+ D3 y, B2 e! j1 E
            } else if (index == 0) {. m* b; w3 C2 q9 [7 a9 X
                //插入头部& {, |! f+ B/ `* i
                insertedNode.next = head;
    ' y* S7 S* X. b' ?            head = insertedNode;
    1 [5 R# ^) `7 G: s) D) b# ^        } else if (size == index) {
      D2 H- W& _, j0 t& `            //插入尾部- }1 {7 q9 I* `$ e
                last.next = insertedNode;
    ! a, r+ g/ j9 n2 j; {            last = insertedNode;
    % _' s& }3 v' u: _& Q, T8 I% `        } else {
    + l$ p7 H7 p+ K0 b            //插入中间4 g% e! I0 F/ s8 ^8 K
                Node prvNode = get(index - 1);
    , u3 S. u6 X# Q! ^            insertedNode.next = prvNode.next;
    6 s8 y" p& q2 v2 R; r5 c7 Y            prvNode.next = insertedNode;3 V* [, w- z& @* f! i7 s
            }: k' Y7 }- B4 h* a% I
            size++;
    & ~5 V7 z1 F* i0 }% S2 x/ F7 E    }8 k6 z; V6 l7 e2 y( h
    - S: e% O$ W/ i9 ]6 X0 V& }2 F1 n7 V
        /**$ ^3 _# r  i5 r6 g7 B# G* a; C
         * 链表删除元素2 c, \# {. X) t% u
         *$ y* Q$ b- h: [$ \
         * @param index 删除的位置$ v+ F; |' ?4 w7 u( s3 k
         * @return 被删除的节点+ W( ~& k0 o6 R* A
         */
    ' b, i  U- B" {7 }3 |' V. I- V    public Node remove(int index) {
    & n4 h$ `5 e5 H. j* ?4 f& g* x' W        if (index < 0 || index > size) {
      j1 P# N* w: S            throw new IndexOutOfBoundsException("超出链表节点范围");/ A- a- }+ M; y( \6 n
            }
    : c8 O9 }* B& Z6 B& F" i; y' f        Node removeNode;3 a: f$ C, v3 i# R4 X3 G5 z
            if (index == 0) {9 }! n$ i' ^* I% r+ P5 l
                if (size == 0) {6 e% k8 r% g7 ?3 `- E' X  u
                    throw new NullPointerException("当前链表为空,不可以进行删除操作");
    0 G5 T( K0 ], d2 d& v            }( {& t& k* ]8 `+ P% X4 \, O
                //删除头节点
    * w+ ?  L- {+ Y            removeNode = head;4 }, n- s& B" K% [" f' @4 o- [
                head = head.next;" u+ J: W7 w% }3 ~4 B" `
            } else if (index == size - 1) {
    6 f, C: ]8 |, e/ z2 D# g+ E0 [            //删除尾节点6 D+ _( m$ s( U; b; |  j' J
                Node preNode = get(index - 1);# d+ A2 w, K. Z  y& T1 s" t6 _, m
                removeNode = preNode.next;
    5 x' Y) D& _: v0 b+ I4 c: P3 T            preNode.next = null;0 g2 Z/ {/ |/ N! X' C8 U
                last = preNode;+ {4 n; x  B2 K% Q; e& v& {
            } else {
    ) V. Q8 @& y/ {- P5 h            //删除中间节点
    / P6 @1 x' H1 Y4 p& ?; j+ @6 Y. h            Node prevNode = get(index - 1);! ^1 S5 u5 H- L/ c" j
                removeNode = prevNode.next;! T  R) d% l* }! |  o6 ~- K
                prevNode.next = prevNode.next.next;7 x& y4 M4 k8 y& w+ ^3 n4 C% P& S
            }
    - r1 k  U2 g* C& `( H- e        size--;
    4 `  n/ X& w* n7 r1 j: K: V        return removeNode;
    $ A+ M. z. X$ Y. s3 c% g    }! u# K, d# Q, Q# o- ]9 i1 l

    ( u" l. \$ B$ l1 ~# i    /**
    9 H. b$ D; C3 [. l     * 更新节点 将列表中指定位置的节点的data替换为指定的data。3 i( t7 k- T8 e7 S# M
         *. p7 |) o8 `5 Q. E) o
         * @param index 需要更新的节点的位置, k% d( u" V8 t2 h. D" j- {
         * @param data  新data
    ( C7 G! p  [% Y. ]% s     * @return 旧data
    / e) C9 F5 M4 i; G! }/ e% s     */
    ' s6 ~1 [7 o) g/ o$ x) o7 a    public int set(int index, int data) {# x0 {" e# v* W- K$ q0 g
            Node x = get(index);
    - w) F7 C$ V  a+ d% N; T$ C        int oldVal = x.data;2 H8 Q# i9 q) D. U- y6 H! C/ A
            x.data = data;" ~$ b" s" W  \0 L! ]
            return oldVal;
    " a/ b" Y& @" |: G    }
    . h7 x6 n2 A" }% K/ s7 V
    1 S0 J6 U0 _0 j    /**
    * i0 `) O; G7 T; r: w5 w5 b" D. `     * 链表查找元素# a, T9 Z: y; K0 \, x# O
         *
    , R0 h; m( T  C" O     * @param index 查找的位置' X. B) A, O4 e  [+ J! }
         * @return index位置的Node对象
    * l1 T8 x& L* O! t) ]. L! u+ c* ?     */
    5 t" L) f0 Q# f  c+ k    public Node get(int index) {# u/ E* |1 r4 k! M9 w& P3 G% E/ h
            if (index < 0 || index > size) {8 S; l# Q' ~, B& h* {& k( {. H
                throw new IndexOutOfBoundsException("超出链表的节点的范围!");
    2 X1 z% \9 ~6 A0 D/ F# |        }
    2 b$ D$ y6 I% _& x; w9 ]/ j        Node temp = head;
    1 M# s$ t/ Z, r! r) H6 F        for (int i = 0; i < index; i++) {0 I# N$ ]" [3 h7 V1 z& N
                temp = temp.next;
    2 p  c8 M& d  O* ~        }" t$ Z' Y. ^9 E1 u1 [
            return temp;( A  I, W+ e  h' {$ s
        }# m' T' w5 k- N: Y8 b8 l

    + b  r& _1 i4 e& m    /**  A  \& Y) s+ l8 v* W4 S
         * 输出链表
    " J6 t/ a1 R) v; D  j* n& @     */9 J, M/ c% h, G
        public void output() {) z3 C5 i4 i0 b* U1 Y& @
            Node temp = head;! Z% A" d  \  g
            while (temp != null) {/ d$ r3 o% Y2 x1 p3 w' Z
                System.out.print(temp.data + " ");
    . R6 N! x; r% z: n$ p+ w3 t            temp = temp.next;3 _! m; c# R! c+ v
            }9 U; D0 X9 a! q; M/ t
        }4 H4 b5 ~/ a  f. Q1 W# B
    # z/ D4 o, j3 |
        /**& X1 |/ p1 T& [) R% a+ T: Y+ P2 Z
         * 链表节点
    " O( L7 c+ |& e9 [) }     */9 u5 }; ]9 t8 p# u% ^. |( C
        class Node {- V, `2 D, Q9 Y  p4 [9 I& Y5 c0 V8 {
            int data;
    ( Z& n9 X) k- u: e% S+ V3 Q        Node next;( c5 s$ d/ L; S
    $ C1 ~' W- u9 Z- U2 n/ O
            Node(int data) {
    7 u4 w# ?" r/ y" h) n            this.data = data;
    ; h4 p0 k' s9 ?& ~6 r  |        }5 \  b) b; M, Y9 K" n& U
        }; s" Y" _3 `' N* x/ g
    }
    4 }, f+ [- w8 }; i7 V, n4 w: z" f- l

    8 P  d* G+ j! t; O二、双向链表 12.png : y( |1 e8 _1 i2 x
    双向链表比单向链表稍微复杂一些,它的每一个节点除了拥有data和next指针,还拥有指向前置节点的prev 指针。
    5 g9 E) u9 s9 G
    ( T2 t: [6 c& G4 ~; D( _3 g/ H' [* A2 q9 N  U& P& d0 N
    + ~( i9 r4 z5 i+ q8 f: r
    6 @. v# \* R3 a* l, `; ?: h
    ————————————————( [) H$ S' `  }. U
    版权声明:本文为CSDN博主「爱做梦的鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。, y. p( v/ I8 T9 r; ?5 k4 x
    原文链接:https://blog.csdn.net/weixin_43124279/article/details/105904468$ F; w: S+ C, T" b! g

    ; W2 }; k( h( J. @' \8 m+ Z
    5 Z& t5 t. t, O; l4 J5 S( D

    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-20 05:02 , Processed in 0.458109 second(s), 54 queries .

    回顶部