一、移除鏈表元素
1. 203【移除鏈表元素】
題目: 給你一個鏈表的頭節點 head 和一個整數 val ,請你刪除鏈表中所有滿足 Node.val == val 的節點,并返回 新的頭節點 。代碼:
class Solution { public ListNode removeElements ( ListNode head, int val) { ListNode dummyHead = new ListNode ( ) ; dummyHead. next = head; ListNode tempNode = dummyHead; while ( tempNode. next != null ) { if ( tempNode. next. val == val) { tempNode. next = tempNode. next. next; } else { tempNode = tempNode. next; } } return dummyHead. next; }
}
二、設計鏈表
1. 707【設計鏈表】
題目: 你可以選擇使用單鏈表或者雙鏈表,設計并實現自己的鏈表。 單鏈表中的節點應該具備兩個屬性:val 和 next 。val 是當前節點的值,next 是指向下一個節點的指針/引用。如果是雙向鏈表,則還需要屬性 prev 以指示鏈表中的上一個節點。假設鏈表中的所有節點下標從 0 開始。 實現 MyLinkedList 類: MyLinkedList() 初始化 MyLinkedList 對象。 int get(int index) 獲取鏈表中下標為 index 的節點的值。如果下標無效,則返回 -1 。 void addAtHead(int val) 將一個值為 val 的節點插入到鏈表中第一個元素之前。在插入完成后,新節點會成為鏈表的第一個節點。 void addAtTail(int val) 將一個值為 val 的節點追加到鏈表中作為鏈表的最后一個元素。 void addAtIndex(int index, int val) 將一個值為 val 的節點插入到鏈表中下標為 index 的節點之前,如果 index 等于鏈表的長度,那么該節點會被追加到鏈表的末尾。如果 index 比長度更大,該節點將 不會插入 到鏈表中。 void deleteAtIndex(int index) 如果下標有效,則刪除鏈表中下標為 index 的節點。 代碼:
class MyLinkedList { ListNode head; int size; public MyLinkedList ( ) { head = new ListNode ( 0 ) ; size = 0 ; } public int get ( int index) { if ( index >= this . size || index < 0 ) { return - 1 ; } ListNode tempNode = head; for ( int i = 0 ; i <= index; i++ ) { tempNode = tempNode. next; } return tempNode. val; } public void addAtHead ( int val) { ListNode newNode = new ListNode ( val) ; newNode. next = head. next; head. next = newNode; size++ ; } public void addAtTail ( int val) { ListNode newNode = new ListNode ( val) ; ListNode tempNode = head; for ( int i = 0 ; i < size; i++ ) { tempNode = tempNode. next; } tempNode. next = newNode; size++ ; } public void addAtIndex ( int index, int val) { if ( index > size) { return ; } if ( index == size) { addAtTail ( val) ; } else { ListNode newNode = new ListNode ( val) ; ListNode tempNode = head; for ( int i = 0 ; i < index; i++ ) { tempNode = tempNode. next; } newNode. next = tempNode. next; tempNode. next = newNode; size++ ; } } public void deleteAtIndex ( int index) { if ( index< 0 || index>= size) { return ; } ListNode tempNode = head; for ( int i = 0 ; i < index; i++ ) { tempNode = tempNode. next; } tempNode. next = tempNode. next. next; size-- ; }
}
class ListNode { int val; ListNode next; public ListNode ( int val) { this . val = val; }
}
三、操作鏈表
1. 206【反轉鏈表】
題目: 給你單鏈表的頭節點 head ,請你反轉鏈表,并返回反轉后的鏈表。代碼:
class Solution { public ListNode reverseList ( ListNode head) { ListNode tempNode = new ListNode ( ) ; ListNode ansNode = null ; tempNode = head; while ( tempNode != null ) { ListNode node = tempNode. next; tempNode. next = ansNode; ansNode = tempNode; tempNode = node; } return ansNode; }
}
2. 24【兩兩交換鏈表中的節點】
題目: 給你一個鏈表,兩兩交換其中相鄰的節點,并返回交換后鏈表的頭節點。你必須在不修改節點內部的值的情況下完成本題(即,只能進行節點交換)。代碼:
class Solution { public ListNode swapPairs ( ListNode head) { ListNode dummyHead = new ListNode ( ) ; dummyHead. next = head; ListNode tempNode = dummyHead; while ( tempNode. next != null && tempNode. next. next != null ) { ListNode node = tempNode. next; tempNode. next = node. next; node. next = tempNode. next. next; tempNode. next. next = node; tempNode = tempNode. next. next; } return dummyHead. next; }
}
3. 19【刪除鏈表的倒數第N個節點】
題目: 給你一個鏈表,刪除鏈表的倒數第 n 個結點,并且返回鏈表的頭結點。代碼:
class Solution { public ListNode removeNthFromEnd ( ListNode head, int n) { ListNode dummyNode = new ListNode ( ) ; dummyNode. next = head; ListNode left = dummyNode; ListNode right = dummyNode; while ( n >= 0 ) { right = right. next; n-- ; } while ( right != null ) { left = left. next; right = right. next; } left. next = left. next. next; return dummyNode. next; }
}
4. 02.07【鏈表相交】
題目: 給你兩個單鏈表的頭節點 headA 和 headB ,請你找出并返回兩個單鏈表相交的起始節點。如果兩個鏈表沒有交點,返回 null 。代碼:
public class Solution { public ListNode getIntersectionNode ( ListNode headA, ListNode headB) { ListNode tempA = headA; ListNode tempB = headB; int n = 0 , m = 0 ; while ( tempA != null ) { n++ ; tempA = tempA. next; } while ( tempB != null ) { m++ ; tempB = tempB. next; } tempA = headA; tempB = headB; while ( n > m) { tempA = tempA. next; n-- ; } while ( m > n) { tempB = tempB. next; m-- ; } while ( tempA != null ) { if ( tempA == tempB) { return tempA; } tempA = tempA. next; tempB = tempB. next; } return null ; }
}
5. 142 【環形鏈表Ⅱ】
題目: 給定一個鏈表的頭節點 head ,返回鏈表開始入環的第一個節點。 如果鏈表無環,則返回 null。 如果鏈表中有某個節點,可以通過連續跟蹤 next 指針再次到達,則鏈表中存在環。 為了表示給定鏈表中的環,評測系統內部使用整數 pos 來表示鏈表尾連接到鏈表中的位置(索引從 0 開始)。如果 pos 是 -1,則在該鏈表中沒有環。注意:pos 不作為參數進行傳遞,僅僅是為了標識鏈表的實際情況。不允許修改鏈表。代碼:
public class Solution { public ListNode detectCycle ( ListNode head) { ListNode fast = head; ListNode slow = head; while ( fast != null && fast. next != null ) { slow = slow. next; fast = fast. next. next; if ( slow == fast) { ListNode tempNode1 = head; ListNode tempNode2 = fast; while ( tempNode1 != tempNode2) { tempNode1 = tempNode1. next; tempNode2 = tempNode2. next; } return tempNode1; } } return null ; }
}