2017-04-09 46 views
-1

给定一个整数值和一个指向链表头的指针,如何从列表中删除所有大于指定值的节点?从链表中删除大于指定值的节点

例如

列表:10-> 34-> 11-> 19-> 26-> 55-> 17 值:19 输出:10-> 11-> 17(所有大于19的节点需要移除)

(边缘的情况下)

列表:10-> 3-> 17-> 5-> 2-> 14-> 7 值:9 输出:3-> 5-> 2-> 7(所有节点大于9需要删除)

我不是在寻找确切的代码,只是一个算法来解决这个问题!

+1

'std :: list :: remove_if' http://en.cppreference.com/ W/CPP /容器/列表/删除 –

+0

我不需要stl实现...但我正在寻找一种算法来实现它自己! –

+0

请解释你为什么不使用'std :: list'?如果这是一项任务,那么请显示您迄今尝试的内容。 –

回答

1

 考虑这里的图片。假设我们必须删除大于8的节点。首先我们将两个指针temp1和temp2都指向最初的头部。然后通过指针我们将遍历列表并检查temp1将跟踪临时temp2之前的一个节点,因为temp2.​​number大于8 temp1将指向temp2指向的下一个节点并删除节点temp2 node.By遍历所有节点并按照此规则可以删除列表的指定节点.... 我希望你明白了........

+0

你可以请详细说明它的示例代码? –

1

第一分配临时节点到起始节点
然后,你必须三种情况链表 ..
如果在第一位置所需的节点,然后作出启动等于start->next和删除临时节点
如果它在中间,则使另一个节点在temp之前立即停止,并使该节点的下一个等于下一个temp,然后如果它处于最后位置,则使其之前的节点的下一个成为等于nullptr就是这样。

0
private static Node removeNodes(Node start, int x) { 

if(start == null) return start; 

if(start.data > x && start.next == null) return null; 

//find first head node 
Node cur = start; 
Node prev = null; 

//4,5,3,2,1,6 --- where x = 2 
while(cur != null && cur.data > x) { 
    prev = cur; 
    cur = cur.next; 
} 

if(prev != null) prev.next = null; 

Node newHead = cur; 

while(cur.next != null) { 
    if(cur.next.data > x) { 
     cur.next = cur.next.next; 
    } else { 
     cur = cur.next; 
    } 
} 

return newHead; 
}