日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

链表的基本操作——反转与删除

發(fā)布時間:2025/3/12 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 链表的基本操作——反转与删除 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

引言

鏈表相關(guān)的問題幾乎都是coding問題,以下是兩個簡單的鏈表問題。

一、單鏈表或雙鏈表如何反轉(zhuǎn)

1.1 單鏈表的反轉(zhuǎn)操作

給定一個 Node 結(jié)構(gòu):

public static class Node {public int value;public Node next;public Node(int data) {this.value = data;} }

這是一個單鏈表結(jié)構(gòu), 假設(shè)初始時,a --> b --> c --> null :

Node a = new Node(1); Node b = new Node(2); Node c = new Node(3); a.next = b; b.next = c; c.next = null;

那么如何實現(xiàn)指針的反轉(zhuǎn),最終 c --> b --> a --> null ?

代碼實現(xiàn):

public static Node reverseLinkedList(Node head) {Node prev = null;Node next = null;while (head != null) {// 取得下一個Nodenext = head.next;// 改變當(dāng)前 head 的指針,使其指向 prevhead.next = prev;// 后兩步是變換角色,把當(dāng)前的 head 變成 prevprev = head;// 把 next 下一次循環(huán)的 headhead = next;}// 因為最后 head 為 null 才會跳出循環(huán),因此,需要返回 prev 元素return prev; }

測試:

public static void main(String[] args) {Node a = new Node(1);Node b = new Node(2);Node c = new Node(3);a.next = b;b.next = c;c.next = null;Node head = a;printNodes(head);Node newHead = reverseLinkedList(head);System.out.println("\n反轉(zhuǎn)后:");printNodes(newHead); }public static void printNodes(Node head) {while (head != null) {System.out.print(head.value);head = head.next;} }

1.2 雙向鏈表反轉(zhuǎn)

public class LinkedListTest2 {public static Node[] nodes = new Node[3];static {Node a = new Node(1);Node b = new Node(2);Node c = new Node(3);a.prev = null;a.next = b;b.prev = a;b.next = c;c.prev = b;c.next = null;nodes[0] = a;nodes[1] = b;nodes[2] = c;}public static void main(String[] args) {Node head = nodes[0];printNodes(head);Node newHead = reverseLinkedList(head);System.out.println("\n反轉(zhuǎn)后:");printNodes(newHead);}public static void printNodes(Node head) {while (head != null) {System.out.println(head.prev + " <-- " + head.value + " --> " + head.next);head = head.next;}}public static class Node {public Node prev;public int value;public Node next;public Node(int value) {this.value = value;}public String toString() {return Integer.valueOf(value).toString();}}/*** prev <-- head --> next*/public static Node reverseLinkedList(Node head) {Node prev = null;Node next = null;while (head != null) {next = head.next;prev = head.prev;head.prev = next;head.next = prev;prev = head;head = next;}return prev;} }

二、把給定值的節(jié)點都刪除

LeetCode 地址:劍指 Offer 18. 刪除鏈表的節(jié)點

/*** 2 -> 2-> 3-> 2-> 3-> 4* 若:刪除 num = 3,得到:* 2 -> 2-> 2-> 4,return head = 2* 若:刪除 num = 2 得到:* 3-> 3-> 4 ,return head= 3* @param head* @param val* @return*/public static ListNode removeValue(ListNode head, int val) {// head 來到第一個不需要刪除的位置while(head != null) {if (head.val != val) {break;}head = head.next;}// 1、head == null 表示所有 node 都是 num,return null// 2、head != nullListNode prev = head;ListNode curr = head;while (curr != null) {if (curr.val == val)prev.next = curr.next;elseprev = curr;curr = curr.next;}return head;}

?

總結(jié)

以上是生活随笔為你收集整理的链表的基本操作——反转与删除的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。