2020/09/17
链表的相关操作(创建链表,头插和尾插法),链表的排序(以及时间空间复杂度)
创建链表:(该链表不存在头节点)需要将数第一位数值赋给head
尾插法:
//尾插法
public static ListNode createTail(int num[]){
ListNode head = null;
if(num.length < 0)
return null;
else {
head= new ListNode(num[0]);
ListNode tailnode = head;
for (int i = 1; i < num.length; i++) {
ListNode temp = new ListNode(num[i]);
tailnode.next = temp;
tailnode = tailnode.next;
}
}
return head;
}
头插法有两种实现,一种是将数组从后往前遍历,使用尾插法即可
//头插法
public static ListNode createPre(int num[]){
ListNode head = null;
if(num.length < 0)
return null;
else {
head= new ListNode(num[num.length-1]);
ListNode tailnode = head;
for (int i = num.length-2; i >=0; i--) {
ListNode temp = new ListNode(num[i]);
tailnode.next = temp;
tailnode = tailnode.next;
}
}
return head;
}
一种是单独使用头插法
//头插法
public static ListNode createPrea(int num[]){
ListNode head = null;
if(num.length < 0)
return null;
else {
head = new ListNode(num[0]);
for (int i = 1 ;i < num.length; i++) {
ListNode temp = new ListNode(num[i]);
temp.next = head.next;
head.next = temp;
}
}
return head;
}
链表排序:
一般不修改指针,只修改数值:
每一轮找到最小值,进行交换,选择排序了
//链表排序,不可以使用多余的链表和数组空间
public static void sort(ListNode head){
if(head == null) return ;
while (head != null){
int min = head.val;
ListNode temp = head.next;
ListNode temp1 = null;
while (temp != null){
if(min > temp.val) {
min = temp.val;
temp1 = temp;
}
temp = temp.next;
}
//交换节点head和最小值
if(temp1 != null)
swap(head,temp1);//交换值即可
head = head.next;
}
return ;
}
public static void swap(ListNode head,ListNode temp){
int min = temp.val;
temp.val = head.val;
head.val = min;
}