数据结构(三)--链表
生活随笔
收集整理的這篇文章主要介紹了
数据结构(三)--链表
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
數(shù)據(jù)結(jié)構(gòu)(三)–鏈表
文章目錄
- 數(shù)據(jù)結(jié)構(gòu)(三)--鏈表
- 介紹
- 單鏈表
- 代碼實(shí)現(xiàn)
- 翻轉(zhuǎn)鏈表
- 取出倒數(shù)第n個(gè)有效節(jié)點(diǎn)
介紹
鏈表又分:
- 單鏈表
- 雙鏈表
單鏈表
- 頭節(jié)點(diǎn)不存儲(chǔ)數(shù)據(jù),所有操作臨時(shí)引用指向head;
- 刪除/插入節(jié)點(diǎn):先判斷當(dāng)前節(jié)點(diǎn)是否滿足刪除或插入條件,然后判斷是否可以移動(dòng),最后移動(dòng)(反復(fù))
- 遍歷節(jié)點(diǎn):判斷是否可以移動(dòng),移動(dòng),打印
- 打印某一節(jié)點(diǎn):判斷是否可以移動(dòng),移動(dòng),判斷當(dāng)前節(jié)點(diǎn)是否可以打印(反復(fù))
代碼實(shí)現(xiàn)
先實(shí)現(xiàn)節(jié)點(diǎn)
根據(jù)需要可以將數(shù)據(jù)域data的類型改為泛型**< T >**
public class NodeT<T>{private T data;private Node next;public NodeT(){}public NodeT(T data,Node next){this.data = data;this.next = next;}public Node getNext() {return next;}public void setNext(Node next) {this.next = next;}public T getData() {return data;}public void setData(T data) {this.data = data;}@Overridepublic String toString() {return "NodeT{" +"data='" + data + '\''+"}";} }實(shí)現(xiàn)單鏈表
public class LinelistT<T> {private NodeT head ;public LinelistT(){head = new NodeT<T>(null,null);}//打印所有節(jié)點(diǎn)public void printNodes(){NodeT tepm = head;while (true){if (tepm.getNext()==null) break;tepm = tepm.getNext();System.out.println(tepm);}}//尾部添加數(shù)據(jù)public void addNode(T data){NodeT<T> node = new NodeT<T>(data,null);NodeT<T> temp = head;while (true){if (temp.getNext()==null){temp.setNext(node);break;}temp = temp.getNext();}}//插入數(shù)據(jù)public void insertNode(int index,T data){//判斷越界if (index<=0) throw new RuntimeException("越界");NodeT<T> node = new NodeT<T>(data,null);NodeT temp = head;int i=0;while (true){//添加節(jié)點(diǎn)if (i==index-1){node.setNext(temp.getNext());temp.setNext(node);break;}//判斷越界if (temp.getNext()==null) throw new RuntimeException("越界!!!");//移動(dòng)temp = temp.getNext();i++;}}//刪除節(jié)點(diǎn)public NodeT deleteNode(int index) {//判斷越界if (index <=0 )new RuntimeException("越界!!!");NodeT temp = head;int i = 0;while (true) {//刪除節(jié)點(diǎn)if (i == index - 1 && temp.getNext() != null) {NodeT temp2 = temp.getNext();temp.setNext(temp2.getNext());temp2.setNext(null);return temp2;}//判斷越界if (temp.getNext()==null)throw new RuntimeException("越界!!!");//移動(dòng)temp = temp.getNext();i++;}}//打印某一節(jié)點(diǎn)public void printNode(int index){//判斷越界if (index<=0) new RuntimeException("越界!!!");NodeT temp = head;int i=0;while (true){//判斷越界if (temp.getNext()==null) {new RuntimeException("越界!!!");}//移動(dòng)i++;temp = temp.getNext();//打印if (i==index){System.out.println(temp);break;}}}}主函數(shù)
public static void main(String[] args) {LinelistT<String> line = new LinelistT<String>();line.addNode("節(jié)點(diǎn)一");line.addNode("節(jié)點(diǎn)二");line.addNode("節(jié)點(diǎn)三");line.printNodes();System.out.println("-----------------------------");line.deleteNode(2);line.printNodes();System.out.println("-----------------------------");line.insertNode(2,"插入節(jié)點(diǎn)");line.printNodes();System.out.println("-----------------------------");}結(jié)果
NodeT{data='節(jié)點(diǎn)一'} NodeT{data='節(jié)點(diǎn)二'} NodeT{data='節(jié)點(diǎn)三'} ----------------------------- NodeT{data='節(jié)點(diǎn)一'} NodeT{data='節(jié)點(diǎn)三'} ----------------------------- NodeT{data='節(jié)點(diǎn)一'} NodeT{data='插入節(jié)點(diǎn)'} NodeT{data='節(jié)點(diǎn)三'} -----------------------------翻轉(zhuǎn)鏈表
在單鏈表中添加以下方法即可,思路如下:
- 創(chuàng)建一個(gè)新的臨時(shí)鏈表reverseHead
- 取出原鏈表的第一個(gè)有效節(jié)點(diǎn)
- 將原鏈表的第一個(gè)有效節(jié)點(diǎn)插入到臨時(shí)鏈表的第一個(gè)有效位置(head后面)
- 將原鏈表Heda的next指向reverseHead的next即可
取出倒數(shù)第n個(gè)有效節(jié)點(diǎn)
獲取有效節(jié)點(diǎn)個(gè)數(shù)
先寫一個(gè)統(tǒng)計(jì)有效節(jié)點(diǎn)個(gè)數(shù)的函數(shù),當(dāng)然如果你想優(yōu)化的話,完全可以在鏈表類中添加一個(gè)私有屬性Num,用來記錄個(gè)數(shù),因?yàn)檫@里沒寫,所以就多寫一個(gè)函數(shù)去遍歷。
public int getNodeNum(){NodeT temp = head;int num = 0;while (true){//判斷是否到尾部if (temp.getNext() == null) return num;temp = temp.getNext();num++;}}獲取倒數(shù)有效節(jié)點(diǎn)
public NodeT<T> getNodeByreverse(int reverseIndex){int num = this.getNodeNum();if (reverseIndex>num || reverseIndex<=0) throw new RuntimeException("越界");NodeT<T> temp = head;int i = 0;while (true){if (i==num-reverseIndex+1) break;temp = temp.getNext();i++;}return temp;}總結(jié)
以上是生活随笔為你收集整理的数据结构(三)--链表的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python treading模块
- 下一篇: AWS 基础服务学习