資料結構 連結串列的各種刪除 (刪除連結串列中等於給定值 val 的所有節點)
阿新 • • 發佈:2021-02-07
技術標籤:資料結構
提示:文章寫完後,目錄可以自動生成,如何生成可參考右邊的幫助文件
文章目錄
1.按照節點的值中間刪除
https://leetcode-cn.com/problems/remove-linked-list-elements/
class Solution {
public ListNode removeElements(ListNode head, int val) {
if(head==null){
return head;
}
ListNode pre=head;
ListNode cur=head.next;
while(cur!=null){
if(cur.val==val){
pre.next=cur.next;
cur=cur.next;
continue;
}
pre=pre.next;
cur=cur.next;
}
if(head.val== val){
head=head.next;
}
return head;
}
}
這裡先刪除除頭結點外的滿足條件的節點,最後再判定頭結點的值是否滿足條件,然後進行刪除。
2.按照結點刪除
還可以傳入結點來進行刪除,每個結點不同,哪怕是值一樣,也是不同的結點
public static Node Contains(Node head,Node item){
Node cur =head;
for (;cur!=null;cur=cur.next){
if(cur.val== item.val){
return cur;
}
}
return null;
}
public static void MidRemove(Node head,Node Delete){
if(Contains(head,Delete) instanceof Node){
Node toDelete=Contains(head,Delete);
toDelete.val=toDelete.next.val;
toDelete.next=toDelete.next.next;
}
}
這裡傳入結點通過上面的Contains函式,來驗證是否存在,這個函式會返回一個結點,然後對這個結點進行刪除,但是這個函式有一個問題就是不能刪除最後一個函式,這是一種比較高效的方法,下面一樣的引數,比較慢一點,但是可以刪除任意部位
public static Node remove(Node head, Node toDelete) {
if (head == null) {
return head;
}
if (head == toDelete) {
// 要刪除的就是頭結點
head = head.next;
return head;
}
// 1. 先需要找到 toDelete 的前一個節點
Node prev = head;
while (prev.next != toDelete) {
prev = prev.next;
}
if (prev == null) {
// 沒找到
return head;
}
// 2. 進行刪除
prev.next = toDelete.next;
return head;
}
3.按照下標進行刪除
還是找到要刪除結點的頭一個結點,然後修改指向就可以了。
public static Node RemoveIndex(Node head,int index){
if(index<0 ||index>=Length(head))
return null;
Node cur=head;
if(index==0){
cur=cur.next;
return cur;
}
for(int i=0;i<index-1;i++){
cur=cur.next;
}
cur.next=cur.next.next;
return head;
}
4.頭部刪除
public static Node HeadRemove(Node head){
head=head.next;
return head;
}
5.尾部刪除
public static void LastRemove(Node head){
Node cur = head;
while(cur.next.next!=null){
cur=cur.next;
}
cur.next=null;
}
驗證
MidRemove(head,10);
print(head);
Node Delete = new Node(1);
MidRemove(head,Delete);
print(head);
head=RemoveIndex(head,4);
print(head);
head=HeadRemove(head);
print(head);
LastRemove(head);
print(head);