Java-数据结构-链表部分详解

一、反转链表

 列如:在单向不带头非循环的链表中,反转链表,首先反转不只是把value值进行转,这样的话有点掩耳盗铃。方法不唯一,三指针,头插法,方法不同时间复杂度不同。

演示的是:头插法。

1.首先需要判断head和head.next是否为空,如果为空则return null;

则是,没有节点和只有一个节点

Java-数据结构-链表部分详解_第1张图片

2. 先定义一个car指向head.next,head.next为空。完成了一个节点的反转。

  Java-数据结构-链表部分详解_第2张图片

思路:如何跟下一个节点建立联系???

也是反转链表最关健一步。

Java-数据结构-链表部分详解_第3张图片

3.用carNext来记录下一个car.next的地址。后面用我们的头揷就可以了。

代码如下:

public Node reverseList(Node head) {
    if (head == null){
        return null;
    }
    //说明只有一个节点
    if (head.next == null){
        return head;
    }
    Node car = head.next;
    head.next = null;
    while (car != null){
        Node carNext = car.next;
        //头插法
        car.next = head;
        head = car;
        car = carNext;
    }
    return head;
}

二、删除链表所有值为key的节点

    在时间复杂度为o(n)的前提下完成且不可以创建新的链表。

   删除key为22的节点

Java-数据结构-链表部分详解_第4张图片

思路:用car在前,判断节点是否要删,用beh在后,连接下一个节点,car和beh始终一前一后。

Java-数据结构-链表部分详解_第5张图片

1.会有两种情况,car.val == key 和  != key。

相等肯定是要删的,这个很简单,就不详细说。如果不等需要beh往前走,则car也要往下一个节点走。

if (car.val == key){
   beh.next = car.next;
    car = car.next;
}else {
    beh = car;
    car = car.next;
}

2.上面已经能解决一般的key节点。如果key出现在头节点的位置,显然上面代码不能解决。

Java-数据结构-链表部分详解_第6张图片

想到的是判断head.val == key.如果出现头节点出现key,head = head.next进行处理。处理头节点的·放到while循环之后就行了,while循环结束说明只剩下头节点没有处理 。

代码如下

 public ListNode removeElements(ListNode head, int val) {
        if(head == null){
            return null;
        }
        if(head.next == null){

        }
        ListNode beh = head;
        ListNode car = head.next;
        while (car != null){
            if( car.val == val){
                beh.next = car.next;
            }else{
                beh = car;
            }
            car = car.next;
        }
           if(head.val == val){
                head = head.next;
            }
        return head;
    }
 
  

你可能感兴趣的:(java,链表)