19、删除排序链表中的重复元素给定一个已排序的链表的头 head删除所有重复的元素,使每个元素只出现一次。返回 已排序的链表。
示例 1:
输入:head=[1,1,2]
输出:[1,2]
示例 2:
输入:head=[1,1,2,3,3]
输出:[1,2,3]
提示:
- 链表中节点数目在范围[0,300]内
- 100 <= Node.val <= 100
- 题目数据保证链表已经按升序 排列
1、思路
从头遍历链表,当目前节点的数值和下一个节点的数值相等时通过p.next = p.next.next来删除下一个节点即可。主要是输入输出处理起来麻烦,对于输入,将输入的字符串通过“[”、“,”和“]”分割得到数字,再将数字赋给链表的每个节点;对于输出,将按题目要求处理后的链表的每个节点的数字拼接成字符串,并加上“,”和“[]”。
2、具体实现
java实现:
class ListNode {
int val;
ListNode next;
public ListNode() {
}
public ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
public class day14_1 {
public static ListNode deleteDuplicates(ListNode head) {
ListNode p = head;
while (p != null && p.next != null) {
if (p.val == p.next.val) {
p.next = p.next.next;
} else {
p = p.next;
}
}
return head;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
String[] strs = str.split("\\[|,|\\]");
ListNode head = new ListNode(0);
ListNode p = head;
for (int i = 1; i < strs.length; i++) {
p.next = new ListNode(Integer.parseInt(strs[i]));
p = p.next;
}
head = deleteDuplicates(head);
String result = "";
p = head.next;
while (p != null) {
result = result + (p.val + "") + ",";
p = p.next;
}
System.out.println("[" + result.substring(0, result.length() - 1) + "]");
}
}
20、反转链表
给你单链表的头节点 head,请你反转链表,并返回反转后的链表。
示例 1:
输入:head =[1,2,3,4,5]
输出:[5,4,3,2,1]
示例 2:
输入:head =[1,2]
输出:[2,1]
示例 3:
输入:head =[]
输出:[]
提示:
- 链表中节点的数目范围是[0,5000]
- 5000 <= Node.val <= 5000
1、思路
使用两个指针p和q,初始p指向空,q指向head,使用第三个指针temp来存储q.next,然后顺着链表,q.next指向p,p指向q,q指向原来p.next,因为q.next已经改变,所以temp就派上用场了,直到q为空。
2、具体实现(java)
主要代码:
public ListNode reverseList(ListNode head) {
ListNode p=null;
ListNode q=head;
while(q!=null){
ListNode temp=q.next;
q.next=p;
p=q;
q=temp;
}
return p;
}