私の解決策に苦労していますfor a question on InterviewBit。InterviewBitのLinkedList関数
私は完全な説明にリンクされているが、短期的に:
1)あなたはLinkedListの
2のヘッドノードを与えられている)、リストの最初の半分を取るとなるように値を変更します。
「第一ノードの新しい値=最後のノードの値 - 最初のノードの現在の値 第二ノードの新しい値=最後から二番目のノードの値 - 第二のノードの現在の値」
これは私のアプローチです(それはコンパイルされますが、リストをまったく変更しません)
私の方法では実際に元のリストが変更されていないことがわかります - 私は新しいリストを作成しているようです正しく変更された値は元の値に変更されません。
/**
* Definition for singly-linked list.
* class ListNode {
* public int val;
* public ListNode next;
* ListNode(int x) { val = x; next = null; }
* }
*/
public class Solution {
public ListNode subtract(ListNode a) {
ListNode current = a;
int length = 0;
//get length
while(current.next != null){
length++;
current = current.next;
}
length += 1;
while(current.next != null){
double half = Math.floor(length/2);
for(int i=0; i<half; i++){
//
// if(i == 0){
// int aval = (nthToLast(a, length)).val - a.val;
// a.val = ((nthToLast(a, length-i)).val - a.val);
// a.next = current;
// }
current.val = ((nthToLast(a, length-i)).val - current.val);
current = current.next;
}
}
return a;
}
/* Helper function that given LinkedList head, and int n,
returns the nth to last ListNode in the LinkedList */
public ListNode nthToLast(ListNode head, int n){
ListNode nth = head;
ListNode ahead = head;
/* strategy: set nth to head, and 'ahead' to n places in front of 'nth'
increment at same speed and then when 'ahead' reaches the end, 'nth'
will be in the nth place from the end.
*/
while(ahead.next != null){
for(int i=0; i<n; i++){
ahead = ahead.next;
}
nth = nth.next;
ahead = ahead.next;
}
return nth;
}
}
また、私はこれらのような質問でより良くなるよう努力しています。これはこの質問のための良いアプローチですか?私はこの作業を行う方法を理解したいと思いますが、これが悪いアプローチの場合は私に教えてください。シンプルなヘルパー関数に
私はこれを行いました。下にスクロールすると、「nthToLast」メソッドが表示されます – user146303
私は答えを編集しました。このアプローチでは、必要に応じて開始点または終了点を編集する必要があります – kar09