Directorio de artículos
1. Análisis de preguntas
En una lista vinculada ordenada, hay nodos duplicados, elimine los nodos duplicados en la lista vinculada, los nodos duplicados no se conservan y se devuelve el puntero principal de la lista vinculada. Por ejemplo, la lista enlazada 1-> 2-> 3-> 3-> 4-> 4-> 5 se procesa como 1-> 2-> 5
La clave de esta pregunta es considerar la posibilidad de que el primer nodo y el segundo nodo se dupliquen, por lo que primero debe agregar un nodo principal, y los juicios posteriores pueden agregar el puntero pre para indicar el precursor y el último puntero para indicar que el puntero de trabajo es responsable de la búsqueda posterior.
Segundo, el código
public class Test_14 {
public static void main(String[] args) {
ListNode node1 = new ListNode(1);
ListNode node2 = new ListNode(1);
ListNode node3 = new ListNode(1);
ListNode node4 = new ListNode(1);
ListNode node5 = new ListNode(1);
ListNode node6 = new ListNode(1);
ListNode node7 = new ListNode(1);
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
node5.next = node6;
node6.next = node7;
ListNode result = deleteDuplication(node1);
while (result != null) {
System.out.println(result.val);
result = result.next;
}
}
private static ListNode deleteDuplication(ListNode pHead) {
if (pHead == null || pHead.next == null) {
return pHead;
}
//首先添加一个头结点,防止出现第一个和第二个结点就相同的情况
ListNode head = new ListNode(0);
head.next = pHead;
//pre 指向当前确定不重复的结点,last 表示工作结点,负责往后搜索
ListNode pre = head;
ListNode last = pHead;
while (last != null) {
ListNode temp = last.next;
if (temp != null && last.val == temp.val) {
while (temp != null && last.val == temp.val) {
temp = temp.next;
}
pre.next = temp;
last = temp;
} else {
pre = pre.next;
last = temp;
}
}
return head.next;
}
}
Tres, resumen
Para la eliminación de la lista vinculada, generalmente se utilizan dos punteros, un precursor y un puntero de trabajo