链表删除中间结点-算法练习总结

算法题目

删除中间节点:

实现一种算法,删除单向链表中间的某个节点(即不是第一个或最后一个节点),假定你只能访问该节点。

示例:

输入:单向链表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;
    }*/
}
}

猜你喜欢

转载自www.cnblogs.com/cosefy/p/13182773.html