203リンクされたリスト要素を削除(ポインタを変更)

1.問題の説明:

指定された値valに等しいリンクリスト内のすべてのノードを削除します。

例:

输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5

ソース:LeetCode
リンク:https ://leetcode-cn.com/problems/remove-linked-list-elements/

2.思考分析:

①実際、問題は簡単に理解できます。削除されたリスト要素の場合は、ポインタを変更するだけで解決できます。ListNodeノードを使用して、通過するノードの最後のノードを保存する必要があるため、ノードを削除する必要がありますノードを削除する目的を達成するには、前のノードの次のポインターフィールドを現在のノードの次のノードにポイントする必要があります。ここでは、次の問題に注意する必要があります。

1)削除したノードがヘッドノードの場合、ヘッドポインターを下に移動するだけ

2)トラバースされた要素が削除された要素である場合、前の要素の次のポインタフィールドを次のノードにポイントする必要があります

3)トラバースした要素が前のノードではない場合、前のポインタフィールドの現在のポインタを下に移動できます

②全体的な考え方は比較的理解しやすいため、要素を削除するには、ポインタを変更するだけで完了します

3.コードは次のとおりです。

襟の控除コードに提出します。

import java.util.Scanner;
public class Solution {
    public ListNode removeElements(ListNode head, int val) {
        ListNode p = head;
        /*需要使用一个前缀节点来保存当前节点的上一个节点*/
        ListNode pre = null;
        while (p != null){
            if (p == head && p.val == val) {
                head = head.next;
                p = head;
            }
            else if (p.val == val){
                pre.next = p.next;
                p = pre.next;
            }else {
                pre = p;
                p = p.next;
            }
        }
        return head;
    }
}

テストコードを追加します。

import java.util.Scanner;
public class Solution {
    /*链表节点*/
    public static class ListNode{
        private int val;
        private ListNode next;
        public ListNode(int val) {
            this.val = val;
        }

        /*重写tostring方法用来输出链表的值*/
        @Override
        public String toString() {
            return val + " ";
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        ListNode head = new ListNode(1);
        ListNode next = new ListNode(2);
        head.next = next;
        ListNode next2 = new ListNode(6);
        next.next = next2;
        ListNode next3 = new ListNode(3);
        next.next = next3;
        ListNode next4 = new ListNode(4);
        next3.next = next4;
        ListNode next5 = new ListNode(5);
        next4.next = next5;
        ListNode next6 = new ListNode(6);
        next5.next = next6;
        next6.next = null;
        head = removeElements(head, 6);
        while (head != null){
            System.out.print(head);
            head = head.next;
        }
    }


    public static ListNode removeElements(ListNode head, int val) {
        ListNode p = head;
        /*需要使用一个前缀节点来保存当前节点的上一个节点*/
        ListNode pre = null;
        while (p != null){
            if (p == head && p.val == val) {
                head = head.next;
                p = head;
            }
            else if (p.val == val){
                pre.next = p.next;
                p = pre.next;
            }else {
                pre = p;
                p = p.next;
            }
        }
        return head;
    }
}

 

元の記事569件を公開 153のような 訪問数590,000+

おすすめ

転載: blog.csdn.net/qq_39445165/article/details/105257787