链表的基本操作——反转与删除
生活随笔
收集整理的這篇文章主要介紹了
链表的基本操作——反转与删除
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
引言
鏈表相關的問題幾乎都是coding問題,以下是兩個簡單的鏈表問題。
一、單鏈表或雙鏈表如何反轉
1.1 單鏈表的反轉操作
給定一個 Node 結構:
public static class Node {public int value;public Node next;public Node(int data) {this.value = data;} }這是一個單鏈表結構, 假設初始時,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;那么如何實現指針的反轉,最終 c --> b --> a --> null ?
代碼實現:
public static Node reverseLinkedList(Node head) {Node prev = null;Node next = null;while (head != null) {// 取得下一個Nodenext = head.next;// 改變當前 head 的指針,使其指向 prevhead.next = prev;// 后兩步是變換角色,把當前的 head 變成 prevprev = head;// 把 next 下一次循環的 headhead = next;}// 因為最后 head 為 null 才會跳出循環,因此,需要返回 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反轉后:");printNodes(newHead); }public static void printNodes(Node head) {while (head != null) {System.out.print(head.value);head = head.next;} }1.2 雙向鏈表反轉
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反轉后:");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;} }二、把給定值的節點都刪除
LeetCode 地址:劍指 Offer 18. 刪除鏈表的節點
/*** 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;}?
總結
以上是生活随笔為你收集整理的链表的基本操作——反转与删除的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java类加载及new对象的过程
- 下一篇: java 观察者模式_重学 Java 设