[蓝蓝计算机考研算法训练二期]-day14

94 阅读2分钟

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;
    }