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;
}
}