链表删除中间结点-算法练习总结
算法题目
删除中间节点:
实现一种算法,删除单向链表中间的某个节点(即不是第一个或最后一个节点),假定你只能访问该节点。
示例:
输入:单向链表a->b->c->d->e->f中的节点c
结果:不返回任何数据,但该链表变为a->b->d->e->f
解题思路
解法一:与后结点交换数值,然后删除后结点
思路:由于只能访问当前结点,删除元素一般需要前置结点,所以可以把当前结点的值与后结点交换再删除后结点
分析:时间复杂度是常数级,效率很快,不需要额外内存空间
import com.test.day6_22.ListNode;
/**
@author cosefy
@date 2020/6/23
*/
public class DeleteMiddleNode {
public static void main(String[] args) {
int[] nums = {1, 3, 4, 5};
ListNode head = getLinkedList(nums);
test1(head.next);
}
public static ListNode getLinkedList(int[] nums) {
ListNode head = new ListNode(nums[0]); //链表长度在1-100之间
ListNode L = head;
for (int i = 1; i < nums.length; i++) {
ListNode node = new ListNode(nums[i]);
L.next = node;
L = L.next;
}
return head;
}
//解法一:与后结点交换数值,再删除后结点
public static void test1(ListNode node) {
ListNode next_node = node.next;
//交换两个结点的值
int temp = next_node.val;
next_node.val = node.val;
node.val = temp;
//下面删除next_node
node.next=next_node.next;
//测试
/*while(node!=null){
System.out.println(node.val);
node=node.next;
}*/
}
}