5.13 单词搜索 && 删除链表的倒数第k个结点

单词搜索

虽然是个图的搜索,但本质还是回溯。不是dfs,两者的区别在于dfs不会恢复现场,而回溯需要恢复现场。

class Solution {
	boolean flag = false;
    public boolean exist(char[][] board, String word) {
    	int[][] visited = new int[board.length][board[0].length];
    	for(int i=0; i<board.length; i++) {
    		for(int j=0; j<board[0].length; j++) {
    			backtrack(board, word, visited, i, j, 0);//以ij为起点寻找符合条件的路线
    			if(flag)return true;
    		}
    	}
    	return false;
    }
	
	
	public void backtrack(char[][] board, String word, int[][] visited, int i, int j, int k) {
		if(k>=word.length()) {
			flag = true;
			return;
		}
		if(i<0 || j<0 || i>=board.length || j>=board[0].length || visited[i][j]==1) {
			return;
		}
		if(visited[i][j]==0 && board[i][j]==word.charAt(k)) {
				visited[i][j]=1;//分别向四个方向搜索
				backtrack(board, word, visited, i+1, j, k+1);
				backtrack(board, word, visited, i-1, j, k+1);
				backtrack(board, word, visited, i, j+1, k+1);
				backtrack(board, word, visited, i, j-1, k+1);
                visited[i][j]=0;  //因为exist中有for循环,每次搜寻的起点不同
			}
		return;
}
}

删除链表的倒数第k个结点

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
          int length=0;
    	  ListNode a=head;
    	  ListNode b=head;
    	  while(a!=null) {
    		  length++;
    		  a=a.next;
    	  }
          if(length==1)return head.next;
          if(length==0)return null;
    	  int i=length-n;
    	  int j=1;
          if(i==0)return head.next;
    	  while(b!=null) {
    		  if(j!=i) {
    			  b=b.next;
                  j++;
    		  }
    		  else {
				b.next=b.next.next;
				break;
			}
    	  }
    	  return head;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值