как удалить первый внутренний узел

#c#

#c#

Вопрос:

 class IntNode
    {
        public int value { get; set; }
        public IntNode next { get; set; }

        public IntNode(int value)
        {
            this.value = value;
            this.next = null;
        }
        public IntNode(int value, IntNode next)
        {
            this.value = value;
            this.next = next;
        }
        public bool HasNext()
        {
            return (next != null);
        }
        public override string ToString()
        {
            if (this.HasNext())
                return value   "-->"   next;
            else
                return value   "";
        }
    }
  

итак, если бы я хотел удалить 4-й узел с заданным списком, начинающимся с head:

 IntNode pos = head.next;
IntNode prev = head;
int counter = 0;
while (pos != null)
{
    if (counter == 4) prev.next = pos.next;
    prev = pos;
    pos = pos.next;
}
  

Но я хочу удалить первый узел (когда счетчик равен 0). Как я могу это сделать? Спасибо.

Комментарии:

1. Вам нужен корневой узел, чтобы вы могли удалить первый элемент. Узнал об этом 40 лет назад в CS201.

2. Похоже, вы не увеличиваете свой счетчик

Ответ №1:

Что-то вроде этого должно сделать это за вас:

 while (pos != null)
{
   if ( counter == 0 )
   {
      head = head.next;
      prev = head;
   }
   else
   {
      prev.next = pos.next;
   }
}
  

Комментарии:

1. Но когда я печатаю список (после этой функции), он показывает первое число, даже если оно было удалено. Единственный случай, с которым это сработает, — это если я буду печатать head.next но это нехорошо, потому что я не всегда удаляю первый узел.

2. Тогда, наверное, мне нужно было бы посмотреть вашу функцию печати и как она перемещается по списку.

Ответ №2:

 public void Remove(int index) {
    if(head != null)
    {
        if(index == 0)
        {
            head = head.next;
        }
        else
        {
            IntNode pos = head.next;
            IntNode prev = head;
            while (pos != null)
            {
                --index;
                if (index == 0)
                {
                    prev.next = pos.next;
                    break;
                }
                prev = pos;
                pos = pos.next;
            }
        }
    }
}
  

Комментарии:

1. Это не работает, потому что, если у меня есть 1->2->3->4 и функция получает заголовок (не индекс, потому что вы должны получить список), поэтому head будет head.next только в функции, а не снаружи (протестировал это)

2. Я полагаю, вы неправильно поняли… Эта функция должна быть определена в классе, где определен head, чтобы она могла напрямую изменять значение head…