链表相关基础题练手

98 阅读1分钟
//单链表反转
public static Node reverseLinkedList(Node head) {
        Node pre = null;
        Node next = null;
        while (head != null) {
            //保存下一个节点的指针
            next = head.next;
            //当前节点的next指针指向前一个节点
            head.next = pre;
            //pre指向当前节点
            pre = head;
            //head指向下一个节点
            head = next;
        }
        return pre;
    }
    //双向链表反转
    public static DoubleNode reverseDoubleList(DoubleNode head) {
        DoubleNode pre = null;
        DoubleNode next = null;
        while (head != null) {
            next = head.next;
            head.next = pre;
            head.last = next;
            pre = head;
            head = next;
        }
        return pre;
    }
    //删除链表中值为num的节点
    public static Node removeValue(Node head, int num) {
        //处理头结点值是否为num的情况,因为最后返回头结点,如果头结点值为num,会涉及到换头的操作
        while (head != null) {
            if (head.data != num) {
                break;
            }
            head = head.next;
        }

        Node pre = head;
        Node cur = head;
        //while循环判断主体就是cur指针遍历链表,判断节点的值是否等于num
        //相等则删除,即 pre.next = cur.next
        //不相等则pre和cur指针同时向前走一步,保持pre.next = next
        while (cur != null) {
            if (cur.data == num) {
                pre.next = cur.next;
            } else {
                pre = cur;
            }
            cur = cur.next;
        }
        return head;
    }