原题:根据有序表L2的值删除链表L1的节点。比如:L1 = {A,B,C,D,E,F}, L2={1,2,3,10}
那么删除之后L1={A,E,F},因为节点10不存在
下面是节点类(也为了其他测试的用途,实现了一个copy接口)
public class Node implements Cloneable {
public String value;
public Node next;
public Node(String value, Node next) {
this.value = value;
this.next = next;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
下面是主函数方法~
其中L2我采用了一个数组来存储
public class MinusList {
public static void main(String[] args) {
Node a0 = new Node("a0",null);
Node a1 = new Node("a1",null);
Node a2 = new Node("a2",null);
Node a3 = new Node("a3",null);
Node a4 = new Node("a4",null);
Node a5 = new Node("a5",null);
Node a6 = new Node("a6",null);
a0.next = a1;
a1.next = a2;
a2.next = a3;
a3.next = a4;
a4.next = a5;
a5.next = a6;
int[] array = {2,4,8};
Node head = a0;
Node t = head;
Node t2;
for(int i=0; i < array.length; i++) {
int steps = array[i];
if(i != 0) {
steps = array[i] - array[i-1];
}
for(; (steps > 1) && (t != null); steps--) { //让t指向目标节点的上一个节点
t = t.next;
}
if(t != null) {
t2 = t.next;
t.next = t.next.next;
t2 = null;
}
}
//print all nodes
t = head;
while(t != null) {
System.out.print(t.value + " ");
t = t.next;
}
}
}
分享到:
相关推荐
删除节点需要根据给定的值找到目标节点,然后更新其前一个节点的指针以跳过它。如果删除的是头节点,需要更新头节点的指针。 ```c Node* deleteNode(Node* head, int value) { Node* temp = head, *prev; if ...
if l1.val < l2.val: # 如果l1的节点值更小 curr.next = l1 l1 = l1.next else: curr.next = l2 l2 = l2.next curr = curr.next # 移动curr指针 # 将非空链表剩余部分追加到结果链表 if l1: curr.next = ...
这个问题涉及到链表的操作,包括遍历、比较节点值以及构建新的链表。 首先,我们来理解一下链表的基本概念。链表是一种线性数据结构,其中每个节点包含一个数据元素和一个指针,该指针指向下一个节点。在单链表中,...
接下来,我们需要比较两个链表`L1`和`L2`的节点值。这个过程是通过一个`while`循环实现的,循环条件为`L1`和`L2`都不为空,表示两个链表都没有遍历完。在每次循环中,我们检查`L1`和`L2`当前节点的值,如果`L1`的值...
合并两个有序链表的关键在于比较两个链表中的节点值,并将较小的节点插入到结果链表中。具体步骤如下: 1. **处理特殊情况**:如果其中一个链表为空,那么另一个链表就是合并后的结果。返回非空链表即可。 2. **...
// 节点值 struct ListNode *next; // 指向下一个节点的指针 } ListNode; ``` 2. 创建函数`mergeTwoLists`,接收两个链表的头结点作为参数。函数的目的是返回合并后的新链表的头结点。 3. 在函数内部,我们需要...
然后通过`while`循环,比较`l1`和`l2`当前节点的值,将较小值的节点添加到`current.next`,并移动较小值链表的指针。当其中一个链表为空时,将另一个链表剩余的部分连接到`current.next`。最后返回`dummy_node.next`...
ListNode(int x) : val(x), next(NULL) {} // 构造函数,初始化节点值和指针 }; ``` 链表的实现通常包括插入、删除、遍历等基本操作。插入操作可以在链表的头部、尾部或者指定位置进行。例如,在链表头部插入节点...
2. **主逻辑方法**:`mergeTwoLists`方法实现了核心逻辑,通过比较两个链表的当前节点值,选择较小的节点添加到结果链表中。 3. **创建示例链表**:在`main`方法中创建了两个示例链表`l1`和`l2`,分别包含元素`[1, 2...
标题中的"java-leetcode题解之第21题合并两个有序链表.zip"指的是一个Java编程语言实现的LeetCode算法题解,具体是第21题——“合并两个有序链表”。这道题目要求我们将两个已排序的链表合并为一个新的已排序链表并...
2. **比较节点值**:比较两个链表当前节点的值,选择较小的一个,并将其作为新链表的当前节点。 3. **移动指针**:将选中小的节点的指针向后移动一位,即指向下一个节点。 4. **重复步骤2和3**:继续比较和选择较小...
这两个链表本身已经排序,但它们的长度可能不同,因此合并时需要比较每个链表的当前节点值,并决定接下来添加哪个节点。 在PHP中处理链表,通常我们会定义一个链表节点类,包含一个数据域(用于存储值)和一个指针...
我们比较`l1`和`l2`的当前节点值,将较小值的节点接在`tail`后面,并更新`l1`或`l2`到下一个节点。当其中一个链表遍历完后,将另一个链表剩余的部分接到`tail`后面。最后返回`dummy.next`作为合并后链表的头节点。 ...
2. **比较节点值**:在循环中,我们将比较p1和p2所指向的节点的值。选取较小值的节点,将其添加到结果链表中。同时,更新指向较小节点的指针到其下一个节点。 3. **处理未遍历完的链表**:当一个链表的所有节点都被...
为了实现这一目标,我们需要遍历这两个链表,并比较它们当前节点的值,将较小的节点添加到新链表 `L3` 中,直到遍历完两个链表中的所有节点。 在 `MergeList_L` 函数中,首先定义了三个指针 `p1`、`p2` 和 `p3`,...
3. 删除节点:根据给定的值删除链表中的节点。 4. 遍历链表:按照顺序访问链表的所有节点。 5. 查找节点:根据给定值查找链表中的节点。 6. 链表合并:将两个有序链表合并为一个有序链表。 链表合并是单链表操作中...
if (l1->val < l2->val) { // 如果l1的值较小 tail->next = l1; // 将l1添加到新链表 l1 = l1->next; // 移动l1指针 } else { // 否则,将l2添加到新链表 tail->next = l2; l2 = l2->next; } tail = tail->...
通过比较 `l1` 和 `l2` 的当前节点值,我们可以确定将哪个节点添加到合并后的链表中,然后更新 `prev` 和相应的链表指针。当一个链表遍历完后,我们将另一个链表连接到 `prev->next`。最后,返回 `preHead->next` ...
if l1.val < l2.val: # 如果l1的节点值更小 current.next = l1 l1 = l1.next else: current.next = l2 l2 = l2.next current = current.next # 移动当前节点指针 # 如果其中一个链表为空,另一个链表剩余的...
创建一个新的链表节点作为头节点(记得保存),然后判断 l1 和 l2 头节点的值,将较小值的节点添加到新的链表中。然后继续判断当前 l1 节点和当前 l2 节点